Collaborators: Shane Blowes, Jon Chase, Helmut Hillebrand, Michael Burrows, Amanda Bates, Uli Brose, Benoit Gauzens, Laura Antao, Ruben Remelgado, Carsten Meyer, Myriam Hirt, maybe others Assistance: Katherine Lew, Josef Hauser

Introduction

Methods

library(data.table) # for handling large datasets
library(ggplot2) # for some plotting
library(nlme) # for ME models
library(maps) # for map
library(gridExtra) # to combine ggplots together
library(grid) # to combine ggplots together
library(RColorBrewer)
library(MASS) # for stepAIC
library(piecewiseSEM) # for rsquared() for nlme models

options(width=500) # turn off most text wrapping

# tell RStudio to use project root directory as the root for this notebook. Needed since we are storing code in a separate directory.
knitr::opts_knit$set(root.dir = rprojroot::find_rstudio_root_file()) 
# Turnover and covariates assembled by turnover_vs_temperature_prep.Rmd
trends <- fread('output/turnover_w_covariates.csv.gz')

# set realm order
trends[, REALM := factor(REALM, levels = c('Freshwater', 'Marine', 'Terrestrial'), ordered = FALSE)]

# set up sign of temperature change
trends[, tsign := factor(sign(temptrend))]

# realm that combined Terrestrial and Freshwater, for interacting with human impact
trends[, REALM2 := REALM]
levels(trends$REALM2) = list(TerrFresh = "Freshwater", TerrFresh = "Terrestrial", Marine = "Marine")

# group Marine invertebrates/plants in with All
trends[, taxa_mod2 := taxa_mod]
trends[taxa_mod == 'Marine invertebrates/plants', taxa_mod2 := 'All']

# calculate duration
trends[, duration := maxyrBT - minyrBT + 1]

# trim to data with >= 3 yrs
trends <- trends[nyrBT >= 3, ]

Log-transform some variables, then center and scale.

trends[, tempave.sc := scale(tempave)]
trends[, tempave_metab.sc := scale(tempave_metab)]
trends[, seas.sc := scale(seas)]
trends[, microclim.sc := scale(log(microclim))]
trends[, temptrend.sc := scale(temptrend, center = FALSE)] # do not center
trends[, temptrend_abs.sc := scale(abs(temptrend), center = FALSE)] # do not center, so that 0 is still 0 temperature change
trends[, mass.sc := scale(log(mass_mean_weight))]
trends[, speed.sc := scale(log(speed_mean_weight+1))]
trends[, lifespan.sc := scale(log(lifespan_mean_weight))]
trends[, consumerfrac.sc := scale(consfrac)]
trends[, endothermfrac.sc := scale(endofrac)]
trends[, nspp.sc := scale(log(Nspp))]
trends[, thermal_bias.sc := scale(thermal_bias)]
trends[, npp.sc := scale(log(npp))]
trends[, veg.sc := scale(log(veg+1))]
trends[, duration.sc := scale(log(duration))]
trends[, human_bowler.sc := scale(log(human_bowler+1)), by = REALM2] # separate scaling by realm
trends[REALM2 == 'TerrFresh', human_footprint.sc := scale(log(human_venter+1))]
trends[REALM2 == 'Marine', human_footprint.sc := scale(log(human_halpern))]

Examine how many data points are available

Just turnover

cat('Overall # time-series: ', nrow(trends), '\n')
Overall # time-series:  39195 
cat('# studies: ', trends[, length(unique(STUDY_ID))], '\n')
# studies:  307 
cat('Data points: ', trends[, sum(nyrBT)], '\n')
Data points:  266337 
trends[, table(REALM)]
REALM
 Freshwater      Marine Terrestrial 
        628       35742        2825 
trends[, table(taxa_mod)]
taxa_mod
                        All                  Amphibians                     Benthos                       Birds 
                       1447                         352                        4310                        8719 
                       Fish               Invertebrates                     Mammals Marine invertebrates/plants 
                      21708                        1799                         504                         104 
                      Plant                    Reptiles 
                        248                           4 
trends[, table(taxa_mod, REALM)]
                             REALM
taxa_mod                      Freshwater Marine Terrestrial
  All                                  0   1444           3
  Amphibians                           2      0         350
  Benthos                              0   4310           0
  Birds                                0   6542        2177
  Fish                               610  21098           0
  Invertebrates                       14   1705          80
  Mammals                              0    459          45
  Marine invertebrates/plants          0    104           0
  Plant                                1     80         167
  Reptiles                             1      0           3

With all covariates (Bowler for human)

# the cases we can compare
apply(trends[, .(Jtutrendrem0, REALM, tempave.sc, tempave_metab.sc, seas.sc, microclim.sc, temptrend.sc, mass.sc, speed.sc, lifespan.sc, consumerfrac.sc, endothermfrac.sc, nspp.sc, thermal_bias.sc, npp.sc, veg.sc, human_bowler.sc)], MARGIN = 2, FUN = function(x) sum(!is.na(x)))
    Jtutrendrem0            REALM       tempave.sc tempave_metab.sc          seas.sc     microclim.sc 
           39195            39195            36747            36747            36747            38291 
    temptrend.sc          mass.sc         speed.sc      lifespan.sc  consumerfrac.sc endothermfrac.sc 
           36747            39114            39082            38045            39195            39195 
         nspp.sc  thermal_bias.sc           npp.sc           veg.sc  human_bowler.sc 
           39195            36286            39089            39099            39195 
i <- trends[, complete.cases(Jtutrendrem0, tempave.sc, tempave_metab.sc, seas.sc, microclim.sc, temptrend.sc, mass.sc, speed.sc, lifespan.sc, consumerfrac.sc, endothermfrac.sc, nspp.sc, thermal_bias.sc, npp.sc, veg.sc, human_bowler.sc)]
cat('Overall # time-series: ', sum(i), '\n')
Overall # time-series:  36017 
cat('# studies: ', trends[i, length(unique(STUDY_ID))], '\n')
# studies:  231 
cat('Data points: ', trends[i, sum(nyrBT)], '\n')
Data points:  243237 
trends[i, table(REALM)]
REALM
 Freshwater      Marine Terrestrial 
        608       33098        2311 
trends[i, table(taxa_mod)]
taxa_mod
                        All                  Amphibians                     Benthos                       Birds 
                       1422                          12                        4288                        7198 
                       Fish               Invertebrates                     Mammals Marine invertebrates/plants 
                      20810                        1517                         495                         104 
                      Plant                    Reptiles 
                        169                           2 
trends[i, table(taxa_mod, REALM)]
                             REALM
taxa_mod                      Freshwater Marine Terrestrial
  All                                  0   1420           2
  Amphibians                           2      0          10
  Benthos                              0   4288           0
  Birds                                0   5116        2082
  Fish                               597  20213           0
  Invertebrates                        8   1443          66
  Mammals                              0    459          36
  Marine invertebrates/plants          0    104           0
  Plant                                1     55         113
  Reptiles                             0      0           2

Choose the variance structure for mixed effects models

Try combinations of

  • variance scaled to a power of the number of years in the community time-series
  • variance scaled to a power of the abs temperature trend
  • random intercept for taxa_mod
  • random intercept for STUDY_ID
  • random slope (abs temperature trend) for taxa_mod
  • random slope (abs temperature trend) for STUDY_ID
  • random intercept for rarefyID (for overdispersion)

And choose the one with lowest AIC (not run: takes a long time)

# fit models for variance structure
fixed <- formula(Jtutrendrem0 ~ temptrend_abs.sc*REALM +
                     temptrend_abs.sc*tsign + 
                     temptrend_abs.sc*tempave_metab.sc + 
                     temptrend_abs.sc*seas.sc + 
                     temptrend_abs.sc*microclim.sc + 
                     temptrend_abs.sc*mass.sc + 
                     temptrend_abs.sc*speed.sc + 
                     temptrend_abs.sc*consumerfrac.sc +
                     temptrend_abs.sc*nspp.sc +
                     temptrend_abs.sc*thermal_bias.sc:tsign +
                     temptrend_abs.sc*npp.sc +
                     temptrend_abs.sc*veg.sc +
                     temptrend_abs.sc*duration.sc +
                     temptrend_abs.sc*human_bowler.sc:REALM2)
i <- trends[, complete.cases(Jtutrendrem0, temptrend_abs.sc, REALM, tsign, tempave_metab.sc, seas.sc, 
                             microclim.sc, mass.sc, speed.sc, consumerfrac.sc, nspp.sc,
                             thermal_bias.sc, npp.sc, veg.sc, human_bowler.sc)]
mods <- vector('list', 0)
mods[[1]] <- gls(fixed, data = trends[i,])
mods[[2]] <- gls(fixed, data = trends[i,], weights = varPower(-0.5, ~nyrBT))
mods[[3]] <- gls(fixed, data = trends[i,], weights = varPower(0.5, ~temptrend_abs.sc))

mods[[4]] <- lme(fixed, data = trends[i,], random = ~1|taxa_mod2, control = lmeControl(opt = "optim"))
mods[[5]] <- lme(fixed, data = trends[i,], random = ~1|STUDY_ID, control = lmeControl(opt = "optim"))
mods[[6]] <- lme(fixed, data = trends[i,], random = ~1|taxa_mod2/STUDY_ID, control = lmeControl(opt = "optim"))
mods[[7]] <- lme(fixed, data = trends[i,], random = ~1|STUDY_ID/rarefyID, control = lmeControl(opt = "optim"))
mods[[8]] <- lme(fixed, data = trends[i,], random = ~1|taxa_mod2/STUDY_ID/rarefyID, control = lmeControl(opt = "optim"))

mods[[9]] <- lme(fixed, data = trends[i,], random = ~temptrend_abs.sc | taxa_mod)
mods[[10]] <- lme(fixed, data = trends[i,], random = list(STUDY_ID = ~ temptrend_abs.sc, rarefyID = ~1)) # includes overdispersion. new formula so that random slope is only for study level (not enough data to extend to rarefyID).

mods[[11]] <- lme(fixed, data = trends[i,], random = list(STUDY_ID = ~ temptrend_abs.sc, rarefyID = ~1), weights = varPower(-0.5, ~nyrBT))
mods[[12]] <- lme(fixed, data = trends[i,], random = list(taxa_mod2 = ~ temptrend_abs.sc, STUDY_ID = ~ 1, rarefyID = ~1), weights = varPower(-0.5, ~nyrBT))

aics <- sapply(mods, AIC)
minaics <- aics - min(aics)
minaics
which.min(aics)

Chooses the random slopes (temptrend_abs) & intercepts for STUDY_ID, overdispersion, and variance scaled to number of years. We haven’t dealt with potential testing on the boundary issues here yet.

Results

Where do we have data?

world <- map_data('world')
ggplot(world, aes(x = long, y = lat, group = group)) +
    geom_polygon(fill = 'lightgray', color = 'white') +
    geom_point(data = trends, aes(rarefyID_x, rarefyID_y, group = REALM, color = REALM), size = 0.5, alpha = 0.4)  +
    scale_color_brewer(palette="Set1", name = 'Realm') +
  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
        panel.background = element_blank(), axis.line = element_line(colour = "black"),
        legend.key=element_blank(),
        axis.text=element_text(size=16),
        axis.title=element_text(size=20)) +
  labs(x = 'Longitude (°)', y = 'Latitude (°)')

Mostly northern hemisphere, but spread all over. Not so much in Africa or much of Asia.

##Average rates of turnover (without year 1)

trends[abs(temptrend) >= 0.5, temptrendtext1 := 'Changing >=0.5']
trends[abs(temptrend) <= 0.05, temptrendtext1 := 'Stable <=0.05']
trends[temptrend <= -0.5, temptrendtext2 := 'Cooling <= -0.5']
trends[temptrend >= 0.5, temptrendtext2 := 'Warming >= 0.5']
trends[abs(temptrend) >= 0.5 & abs(temptrend) < 1, temptrendtext3 := 'Slow Changing >=0.5 & <1']
trends[abs(temptrend) >= 1, temptrendtext3 := 'Fast Changing >=1']

trendsum1 <- trends[!is.na(temptrendtext1), 
                    .(type = 'Jtu', 
                      ave = mean(Jtutrendrem0, na.rm=TRUE), 
                      se = sd(Jtutrendrem0, na.rm=TRUE)/sqrt(.N),
                      n = sum(!is.na(Jtutrendrem0))),
                    by = .(text = temptrendtext1)] # turnover per year for locations changing temperature
trendsum1 <- rbind(trendsum1, trends[!is.na(temptrendtext1), 
                    .(type = 'Jbeta', 
                      ave = mean(Jbetatrendrem0, na.rm=TRUE), 
                      se = sd(Jbetatrendrem0, na.rm=TRUE)/sqrt(.N),
                      n = sum(!is.na(Jbetatrendrem0))),
                    by = .(text = temptrendtext1)])
trendsum1 <- rbind(trendsum1, trends[!is.na(temptrendtext1), 
                    .(type = 'Horn', 
                      ave = mean(Horntrendrem0, na.rm=TRUE), 
                      se = sd(Horntrendrem0, na.rm=TRUE)/sqrt(.N),
                      n = sum(!is.na(Horntrendrem0))),
                    by = .(text = temptrendtext1)])

trendsum2 <- trends[!is.na(temptrendtext2), 
                    .(type = 'Jtu', 
                      ave = mean(Jtutrendrem0, na.rm=TRUE), 
                      se = sd(Jtutrendrem0, na.rm=TRUE)/sqrt(.N),
                      n = sum(!is.na(Jtutrendrem0))),
                    by = .(text = temptrendtext2)] # inc. direction
trendsum2 <- rbind(trendsum2, trends[!is.na(temptrendtext2), 
                    .(type = 'Jbeta', 
                      ave = mean(Jbetatrendrem0, na.rm=TRUE), 
                      se = sd(Jbetatrendrem0, na.rm=TRUE)/sqrt(.N),
                      n = sum(!is.na(Jbetatrendrem0))),
                    by = .(text = temptrendtext2)])
trendsum2 <- rbind(trendsum2, trends[!is.na(temptrendtext2), 
                    .(type = 'Horn', 
                      ave = mean(Horntrendrem0, na.rm=TRUE), 
                      se = sd(Horntrendrem0, na.rm=TRUE)/sqrt(.N),
                      n = sum(!is.na(Horntrendrem0))),
                    by = .(text = temptrendtext2)])

trendsum3 <- trends[!is.na(temptrendtext3), 
                    .(type = 'Jtu', 
                      ave = mean(Jtutrendrem0, na.rm=TRUE), 
                      se = sd(Jtutrendrem0, na.rm=TRUE)/sqrt(.N),
                      n = sum(!is.na(Jtutrendrem0))),
                    by = .(text = temptrendtext3)] # inc. rate
trendsum3 <- rbind(trendsum3, trends[!is.na(temptrendtext3), 
                    .(type = 'Jbeta', 
                      ave = mean(Jbetatrendrem0, na.rm=TRUE), 
                      se = sd(Jbetatrendrem0, na.rm=TRUE)/sqrt(.N),
                      n = sum(!is.na(Jbetatrendrem0))),
                    by = .(text = temptrendtext3)])
trendsum3 <- rbind(trendsum3, trends[!is.na(temptrendtext3), 
                    .(type = 'Horn', 
                      ave = mean(Horntrendrem0, na.rm=TRUE), 
                      se = sd(Horntrendrem0, na.rm=TRUE)/sqrt(.N),
                      n = sum(!is.na(Horntrendrem0))),
                    by = .(text = temptrendtext3)])

trendsum4 <- rbind(trendsum1, trendsum2, trendsum3)
setorder(trendsum4, type, text)

write.csv(trendsum4, file = 'output/trendsummary.csv', row.names = FALSE)

trendsum4

Plots of turnover rates

Temperature-only model (Jtutrend, Jbetatrend, Horntrend)

i4 <- trends[, complete.cases(Jtutrendrem0, REALM, temptrend)]

randef <- list(STUDY_ID = ~ abs(temptrend), rarefyID = ~1)
varef <- varPower(-0.5, ~nyrBT)

if(file.exists('temp/modonlyTtrendrem0.rds')){
  modonlyTtrendrem0 <- readRDS('temp/modonlyTtrendrem0.rds')
} else {
  modonlyTtrendrem0 <- lme(Jtutrendrem0 ~ abs(temptrend)*REALM,
                   random = randef, weights = varef, data = trends[i4,], method = 'REML')
  saveRDS(modonlyTtrendrem0, file = 'temp/modonlyTtrendrem0.rds')
}

i5 <- trends[, complete.cases(Jbetatrendrem0, REALM, temptrend)]
if(file.exists('temp/modonlyTtrendJbetarem0.rds')){
  modonlyTtrendJbetarem0 <- readRDS('temp/modonlyTtrendJbetarem0.rds')
} else {
  modonlyTtrendJbetarem0 <- lme(Jbetatrendrem0 ~ abs(temptrend)*REALM,
                   random = randef, weights = varef, data = trends[i5,], method = 'REML', 
                   control=lmeControl(msMaxIter = 100, maxIter = 100))
  saveRDS(modonlyTtrendJbetarem0, file = 'temp/modonlyTtrendJbetarem0.rds')
}

i6 <- trends[, complete.cases(Horntrendrem0, REALM, temptrend)]
if(file.exists('temp/modonlyTtrendHornrem0.rds')){
  modonlyTtrendHornrem0 <- readRDS('temp/modonlyTtrendHornrem0.rds')
} else {
  modonlyTtrendHornrem0 <- lme(Horntrendrem0 ~ abs(temptrend)*REALM,
                   random = randef, weights = varef, data = trends[i6,], method = 'REML')
  saveRDS(modonlyTtrendHornrem0, file = 'temp/modonlyTtrendHornrem0.rds')
}

summary(modonlyTtrendrem0)
Linear mixed-effects model fit by REML
 Data: trends[i4, ] 

Random effects:
 Formula: ~abs(temptrend) | STUDY_ID
 Structure: General positive-definite, Log-Cholesky parametrization
               StdDev      Corr  
(Intercept)    0.007657053 (Intr)
abs(temptrend) 0.197650298 -0.935

 Formula: ~1 | rarefyID %in% STUDY_ID
        (Intercept) Residual
StdDev:  0.01097849 2.000161

Variance function:
 Structure: Power of variance covariate
 Formula: ~nyrBT 
 Parameter estimates:
    power 
-2.121022 
Fixed effects: Jtutrendrem0 ~ abs(temptrend) * REALM 
 Correlation: 
                                (Intr) abs(t) REALMM REALMT a():REALMM
abs(temptrend)                  -0.807                                
REALMMarine                     -0.947  0.764                         
REALMTerrestrial                -0.901  0.727  0.853                  
abs(temptrend):REALMMarine       0.766 -0.949 -0.814 -0.690           
abs(temptrend):REALMTerrestrial  0.733 -0.908 -0.693 -0.810  0.862    

Standardized Within-Group Residuals:
        Min          Q1         Med          Q3         Max 
-6.57101792 -0.22892007 -0.01904447  0.27434430  5.64177564 

Number of Observations: 36747
Number of Groups: 
              STUDY_ID rarefyID %in% STUDY_ID 
                   292                  36747 
summary(modonlyTtrendJbetarem0)
Linear mixed-effects model fit by REML
 Data: trends[i5, ] 

Random effects:
 Formula: ~abs(temptrend) | STUDY_ID
 Structure: General positive-definite, Log-Cholesky parametrization
               StdDev      Corr  
(Intercept)    0.005965236 (Intr)
abs(temptrend) 0.160013131 -0.038

 Formula: ~1 | rarefyID %in% STUDY_ID
        (Intercept)  Residual
StdDev: 0.003861919 0.9688156

Variance function:
 Structure: Power of variance covariate
 Formula: ~nyrBT 
 Parameter estimates:
    power 
-1.887978 
Fixed effects: Jbetatrendrem0 ~ abs(temptrend) * REALM 
 Correlation: 
                                (Intr) abs(t) REALMM REALMT a():REALMM
abs(temptrend)                  -0.543                                
REALMMarine                     -0.941  0.511                         
REALMTerrestrial                -0.906  0.492  0.852                  
abs(temptrend):REALMMarine       0.515 -0.948 -0.524 -0.467           
abs(temptrend):REALMTerrestrial  0.494 -0.908 -0.464 -0.542  0.861    

Standardized Within-Group Residuals:
        Min          Q1         Med          Q3         Max 
-8.57430409 -0.30896466 -0.02462766  0.32539894  8.23224466 

Number of Observations: 36747
Number of Groups: 
              STUDY_ID rarefyID %in% STUDY_ID 
                   292                  36747 
summary(modonlyTtrendHornrem0)
Linear mixed-effects model fit by REML
 Data: trends[i6, ] 

Random effects:
 Formula: ~abs(temptrend) | STUDY_ID
 Structure: General positive-definite, Log-Cholesky parametrization
               StdDev     Corr  
(Intercept)    0.01201968 (Intr)
abs(temptrend) 0.25314398 0.016 

 Formula: ~1 | rarefyID %in% STUDY_ID
        (Intercept) Residual
StdDev:  0.01882813 2.441788

Variance function:
 Structure: Power of variance covariate
 Formula: ~nyrBT 
 Parameter estimates:
    power 
-2.318769 
Fixed effects: Horntrendrem0 ~ abs(temptrend) * REALM 
 Correlation: 
                                (Intr) abs(t) REALMM REALMT a():REALMM
abs(temptrend)                  -0.472                                
REALMMarine                     -0.944  0.446                         
REALMTerrestrial                -0.899  0.424  0.848                  
abs(temptrend):REALMMarine       0.447 -0.945 -0.455 -0.401           
abs(temptrend):REALMTerrestrial  0.428 -0.906 -0.404 -0.473  0.856    

Standardized Within-Group Residuals:
        Min          Q1         Med          Q3         Max 
-5.75457482 -0.22483445 -0.02254226  0.23615730  5.73488343 

Number of Observations: 36005
Number of Groups: 
              STUDY_ID rarefyID %in% STUDY_ID 
                   257                  36005 

Plot the temp-only coefficients

colors <- brewer.pal(3, 'Dark2')

# make table of coefficients
coefs1 <- as.data.frame(summary(modonlyTtrendrem0)$tTable)
coefs2 <- as.data.frame(summary(modonlyTtrendJbetarem0)$tTable)
coefs3 <- as.data.frame(summary(modonlyTtrendHornrem0)$tTable)
coefs1$mod <- 'Jtu'
coefs2$mod <- 'Jbeta'
coefs3$mod <- 'Horn'
rows1 <- which(grepl('temptrend', rownames(coefs1))) # extract temperature effect
cols <- c('Value', 'Std.Error', 'mod')
allcoefs <- rbind(coefs1[rows1, cols], coefs2[rows1, cols], coefs3[rows1, cols])
allcoefs$Value[grepl('REALMMarine', rownames(allcoefs))] <- 
  allcoefs$Value[grepl('REALMMarine', rownames(allcoefs))] + 
  allcoefs$Value[!grepl('REALM', rownames(allcoefs))] # add intercept to marine effects
allcoefs$Value[grepl('REALMTerrestrial', rownames(allcoefs))] <- 
  allcoefs$Value[grepl('REALMTerrestrial', rownames(allcoefs))] + 
  allcoefs$Value[!grepl('REALM', rownames(allcoefs))] # add intercept to terrestrial effects

allcoefs$lCI <- allcoefs$Value - allcoefs$Std.Error # lower confidence interval
allcoefs$uCI <- allcoefs$Value + allcoefs$Std.Error
allcoefs$y <- c(3, 2, 1) + rep(c(0, -0.1, -0.2), c(3, 3, 3)) # y-values
allcoefs$col <- c(rep(colors[1], 3), rep(colors[2], 3), rep(colors[3], 3))
allcoefs$realm <- rep(c('Freshwater', 'Marine', 'Terrestrial'), 3)

par(las = 1, mai = c(0.8, 2, 0.1, 0.1))
plot(0,0, col = 'white', xlim=c(-0.1, 0.85), ylim = c(0.5,3), 
     yaxt='n', xlab = 'Turnover per |°C/yr|', ylab ='')
axis(2, at = 3:1, labels = c('Freshwater', 'Marine', 'Terrestrial'), cex.axis = 0.7)
abline(v = 0, col = 'grey')
for(i in 1:nrow(allcoefs)){
  with(allcoefs[i, ], points(Value, y, pch = 16, col = col))
  with(allcoefs[i, ], lines(x = c(lCI, uCI), y = c(y, y), col = col))
}
legend('bottomright', col = colors, lwd = 1, pch = 16, 
       legend = c('Jaccard turnover', 'Jaccard total', 'Horn-Morisita',
                  'Jaccard turnover rem0', 'Jaccard total rem0', 'Horn-Morisita rem0'))

Full models

Try static covariates plus interactions of abs temperature trend with each covariate:

  • realm
  • speed
  • mass
  • average metabolic temperature
  • consumer fraction
  • environmental temperature
  • seasonality
  • microclimates
  • thermal bias
  • NPP
  • vegetation
  • duration
  • human footprint

Except for thermal bias: interact with temperature trend (not abs)

Fit/load full models

Bowler vs Venter/Halpern human impact

Bowler has lower AIC.

# using Bowler for human impact
i1 <- trends[, complete.cases(Jtutrendrem0, REALM, tempave_metab.sc, seas.sc, microclim.sc, 
                             temptrend_abs.sc, mass.sc, speed.sc, 
                             consumerfrac.sc, nspp.sc, thermal_bias.sc, npp.sc, 
                             veg.sc, duration.sc, human_bowler.sc, human_footprint.sc)]

randef <- list(STUDY_ID = ~ temptrend_abs.sc, rarefyID = ~1)
varef <- varPower(-0.5, ~nyrBT)

if(file.exists('temp/modTfullbowlerrem0.rds')){
  modTfullbowlerrem0 <- readRDS('temp/modTfullbowlerrem0.rds')
} else {

modTfullbowlerrem0 <- lme(Jtutrendrem0 ~ temptrend_abs.sc*REALM +
                     temptrend_abs.sc*tsign + 
                     temptrend_abs.sc*tempave_metab.sc + 
                     temptrend_abs.sc*seas.sc + 
                     temptrend_abs.sc*microclim.sc + 
                     temptrend_abs.sc*mass.sc + 
                     temptrend_abs.sc*speed.sc + 
                     temptrend_abs.sc*consumerfrac.sc +
                     temptrend_abs.sc*nspp.sc +
                     temptrend_abs.sc*thermal_bias.sc:tsign +
                     temptrend_abs.sc*npp.sc +
                     temptrend_abs.sc*veg.sc +
                     temptrend_abs.sc*duration.sc +
                     temptrend_abs.sc*human_bowler.sc:REALM2,
                   random = randef, weights = varef, data = trends[i1,], method = 'REML')
  saveRDS(modTfullbowlerrem0, file = 'temp/modTfullbowlerrem0.rds')
}

# using Venter/Halpern for human impact
if(file.exists('temp/modTfullfootprintrem0.rds')){
  modTfullfootprintrem0 <- readRDS('temp/modTfullfootprintrem0.rds')
} else {
modTfullfootprintrem0 <- lme(Jtutrendrem0 ~ temptrend_abs.sc*REALM + 
                     temptrend_abs.sc*tsign + 
                     temptrend_abs.sc*tempave_metab.sc + 
                     temptrend_abs.sc*seas.sc + 
                     temptrend_abs.sc*microclim.sc + 
                     temptrend_abs.sc*mass.sc + 
                     temptrend_abs.sc*speed.sc + 
                     temptrend_abs.sc*consumerfrac.sc +
                     temptrend_abs.sc*nspp.sc +
                     temptrend_abs.sc*thermal_bias.sc:tsign +
                     temptrend_abs.sc*npp.sc +
                     temptrend_abs.sc*veg.sc +
                     temptrend_abs.sc*duration.sc +
                     temptrend_abs.sc*human_footprint.sc:REALM2,
                   random = randef, weights = varef, data = trends[i1,], method = 'REML',
                   control = lmeControl(maxIter = 100, msMaxIter = 100, niterEM = 50, msMaxEval = 500))
  saveRDS(modTfullfootprintrem0, file = 'temp/modTfullfootprintrem0.rds')

}
AIC(modTfullbowlerrem0, modTfullfootprintrem0)
NA

Full models

i1 <- trends[, complete.cases(Jtutrendrem0, REALM, tempave_metab.sc, seas.sc, microclim.sc, 
                             temptrend_abs.sc, mass.sc, speed.sc, 
                             consumerfrac.sc, nspp.sc, thermal_bias.sc, npp.sc, 
                             veg.sc, duration.sc, human_bowler.sc)]
i2 <- trends[, complete.cases(Jbetatrendrem0, REALM, tempave_metab.sc, seas.sc, microclim.sc, 
                             temptrend_abs.sc, mass.sc, speed.sc, 
                             consumerfrac.sc, nspp.sc, thermal_bias.sc, npp.sc, 
                             veg.sc, duration.sc, human_bowler.sc)]
i3 <- trends[, complete.cases(Horntrendrem0, REALM, tempave_metab.sc, seas.sc, microclim.sc, 
                             temptrend_abs.sc, mass.sc, speed.sc, 
                             consumerfrac.sc, nspp.sc, thermal_bias.sc, npp.sc, 
                             veg.sc, duration.sc, human_bowler.sc)]

randef <- list(STUDY_ID = ~ temptrend_abs.sc, rarefyID = ~1)
varef <- varPower(-0.5, ~nyrBT)

# full models
if(file.exists('temp/modTfullJturem0.rds')){
  modTfullJturem0 <- readRDS('temp/modTfullJturem0.rds')
} else {
  modTfullJturem0 <- lme(Jtutrendrem0 ~ temptrend_abs.sc*REALM + 
                         temptrend_abs.sc*tsign +
                         temptrend_abs.sc*tempave_metab.sc + 
                         temptrend_abs.sc*seas.sc + 
                         temptrend_abs.sc*microclim.sc + 
                         temptrend_abs.sc*mass.sc + 
                         temptrend_abs.sc*speed.sc + 
                         temptrend_abs.sc*consumerfrac.sc +
                         temptrend_abs.sc*nspp.sc +
                         temptrend_abs.sc*thermal_bias.sc:tsign +
                         temptrend_abs.sc*npp.sc +
                         temptrend_abs.sc*veg.sc +
                         temptrend_abs.sc*duration.sc +
                         temptrend_abs.sc*human_bowler.sc:REALM2,
                       random = randef, weights = varef, data = trends[i2,], method = 'REML')
  saveRDS(modTfullJturem0, file = 'temp/modTfullJturem0.rds')
}

if(file.exists('temp/modTfullJbetarem0.rds')){
  modTfullJbetarem0 <- readRDS('temp/modTfullJbetarem0.rds')
} else {
  modTfullJbetarem0 <- lme(Jbetatrendrem0 ~ temptrend_abs.sc*REALM + 
                         temptrend_abs.sc*tsign +
                         temptrend_abs.sc*tempave_metab.sc + 
                         temptrend_abs.sc*seas.sc + 
                         temptrend_abs.sc*microclim.sc + 
                         temptrend_abs.sc*mass.sc + 
                         temptrend_abs.sc*speed.sc + 
                         temptrend_abs.sc*consumerfrac.sc +
                         temptrend_abs.sc*nspp.sc +
                         temptrend_abs.sc*thermal_bias.sc:tsign +
                         temptrend_abs.sc*npp.sc +
                         temptrend_abs.sc*veg.sc +
                         temptrend_abs.sc*duration.sc +
                         temptrend_abs.sc*human_bowler.sc:REALM2,
                       random = randef, weights = varef, data = trends[i2,], method = 'REML')
  saveRDS(modTfullJbetarem0, file = 'temp/modTfullJbetarem0.rds')
}

if(file.exists('temp/modTfullHornrem0.rds')){
  modTfullHornrem0 <- readRDS('temp/modTfullHornrem0.rds')
} else {
  modTfullHornrem0 <- lme(Horntrendrem0 ~ temptrend_abs.sc*REALM + 
                        temptrend_abs.sc*tsign +
                        temptrend_abs.sc*tempave_metab.sc + 
                        temptrend_abs.sc*seas.sc + 
                        temptrend_abs.sc*microclim.sc + 
                        temptrend_abs.sc*mass.sc + 
                        temptrend_abs.sc*speed.sc + 
                        temptrend_abs.sc*consumerfrac.sc +
                        temptrend_abs.sc*nspp.sc +
                        temptrend_abs.sc*thermal_bias.sc:tsign +
                        temptrend_abs.sc*npp.sc +
                        temptrend_abs.sc*veg.sc +
                        temptrend_abs.sc*duration.sc +
                        temptrend_abs.sc*human_bowler.sc:REALM2,
                      random = randef, weights = varef, data = trends[i3,], method = 'REML')
  saveRDS(modTfullHornrem0, file = 'temp/modTfullHornrem0.rds')
}

summary(modTfullJturem0)
Linear mixed-effects model fit by REML
 Data: trends[i2, ] 

Random effects:
 Formula: ~temptrend_abs.sc | STUDY_ID
 Structure: General positive-definite, Log-Cholesky parametrization
                 StdDev      Corr  
(Intercept)      0.009402743 (Intr)
temptrend_abs.sc 0.024575808 -0.966

 Formula: ~1 | rarefyID %in% STUDY_ID
        (Intercept) Residual
StdDev:  0.01091239 2.006389

Variance function:
 Structure: Power of variance covariate
 Formula: ~nyrBT 
 Parameter estimates:
    power 
-2.129145 
Fixed effects: Jtutrendrem0 ~ temptrend_abs.sc * REALM + temptrend_abs.sc *      tsign + temptrend_abs.sc * tempave_metab.sc + temptrend_abs.sc *      seas.sc + temptrend_abs.sc * microclim.sc + temptrend_abs.sc *      mass.sc + temptrend_abs.sc * speed.sc + temptrend_abs.sc *      consumerfrac.sc + temptrend_abs.sc * nspp.sc + temptrend_abs.sc *      thermal_bias.sc:tsign + temptrend_abs.sc * npp.sc + temptrend_abs.sc *      veg.sc + temptrend_abs.sc * duration.sc + temptrend_abs.sc *      human_bowler.sc:REALM2 
 Correlation: 
                                                 (Intr) tmpt_. REALMM REALMT tsign1 tmpv_. ses.sc mcrcl. mss.sc
temptrend_abs.sc                                 -0.797                                                        
REALMMarine                                      -0.955  0.757                                                 
REALMTerrestrial                                 -0.683  0.574  0.634                                          
tsign1                                           -0.095  0.063  0.007  0.012                                   
tempave_metab.sc                                  0.061 -0.037 -0.053 -0.242  0.074                            
seas.sc                                          -0.150  0.143  0.202 -0.097 -0.070  0.138                     
microclim.sc                                     -0.068  0.047  0.077  0.006  0.015 -0.157  0.097              
mass.sc                                           0.061 -0.042 -0.036 -0.038 -0.019  0.100  0.127 -0.001       
speed.sc                                          0.107 -0.093 -0.057 -0.084 -0.073 -0.194 -0.055  0.070 -0.437
consumerfrac.sc                                  -0.028  0.022  0.017  0.133  0.014 -0.135 -0.055  0.017  0.016
nspp.sc                                           0.020  0.000 -0.074 -0.066  0.049 -0.154 -0.037 -0.113 -0.010
npp.sc                                            0.041 -0.044 -0.061  0.054  0.041  0.037 -0.136 -0.187 -0.027
veg.sc                                           -0.578  0.387  0.599  0.024 -0.006  0.007  0.080 -0.010  0.021
duration.sc                                      -0.037  0.008  0.032  0.016 -0.160  0.085 -0.006 -0.016 -0.057
temptrend_abs.sc:REALMMarine                      0.764 -0.951 -0.804 -0.534 -0.014  0.030 -0.184 -0.056  0.020
temptrend_abs.sc:REALMTerrestrial                 0.542 -0.693 -0.499 -0.820 -0.018  0.182  0.078  0.024  0.033
temptrend_abs.sc:tsign1                           0.067 -0.140 -0.022 -0.014 -0.507 -0.056  0.012 -0.006 -0.005
temptrend_abs.sc:tempave_metab.sc                -0.037  0.042  0.028  0.171 -0.058 -0.788 -0.106  0.091 -0.066
temptrend_abs.sc:seas.sc                          0.145 -0.158 -0.183  0.095  0.053 -0.100 -0.777 -0.099 -0.081
temptrend_abs.sc:microclim.sc                     0.038 -0.062 -0.047  0.020 -0.014  0.088 -0.068 -0.760  0.028
temptrend_abs.sc:mass.sc                         -0.040  0.048  0.010  0.020 -0.002 -0.086 -0.066  0.019 -0.701
temptrend_abs.sc:speed.sc                        -0.084  0.104  0.040  0.073  0.069  0.167  0.031 -0.041  0.266
temptrend_abs.sc:consumerfrac.sc                  0.030 -0.037 -0.018 -0.117 -0.007  0.105  0.038  0.009  0.006
temptrend_abs.sc:nspp.sc                          0.009  0.008  0.038  0.037 -0.033  0.143  0.035  0.069  0.033
tsign-1:thermal_bias.sc                           0.061 -0.041 -0.057 -0.046 -0.078  0.132 -0.217 -0.015 -0.043
tsign1:thermal_bias.sc                            0.095 -0.074 -0.103 -0.097  0.063  0.223 -0.330 -0.100 -0.043
temptrend_abs.sc:npp.sc                          -0.039  0.065  0.059 -0.051 -0.028 -0.007  0.116  0.168 -0.004
temptrend_abs.sc:veg.sc                           0.411 -0.507 -0.431  0.022 -0.008 -0.018 -0.115  0.003 -0.018
                                                 spd.sc cnsmr. nspp.s npp.sc veg.sc drtn.s t_.:REALMM t_.:REALMT
temptrend_abs.sc                                                                                                
REALMMarine                                                                                                     
REALMTerrestrial                                                                                                
tsign1                                                                                                          
tempave_metab.sc                                                                                                
seas.sc                                                                                                         
microclim.sc                                                                                                    
mass.sc                                                                                                         
speed.sc                                                                                                        
consumerfrac.sc                                  -0.144                                                         
nspp.sc                                           0.184  0.094                                                  
npp.sc                                            0.125 -0.045 -0.188                                           
veg.sc                                           -0.019 -0.010  0.024 -0.178                                    
duration.sc                                      -0.009  0.005 -0.252  0.062 -0.012                             
temptrend_abs.sc:REALMMarine                      0.047 -0.015  0.046  0.064 -0.406 -0.018                      
temptrend_abs.sc:REALMTerrestrial                 0.068 -0.104  0.025 -0.047  0.019 -0.005  0.639               
temptrend_abs.sc:tsign1                           0.041 -0.007 -0.029 -0.038 -0.018  0.031  0.044      0.011    
temptrend_abs.sc:tempave_metab.sc                 0.134  0.116  0.154 -0.031 -0.012 -0.031 -0.027     -0.228    
temptrend_abs.sc:seas.sc                          0.032  0.029  0.038  0.123 -0.109 -0.027  0.207     -0.162    
temptrend_abs.sc:microclim.sc                    -0.055  0.002  0.074  0.183  0.006  0.011  0.077     -0.051    
temptrend_abs.sc:mass.sc                          0.315  0.008  0.031 -0.007 -0.007  0.044 -0.014     -0.004    
temptrend_abs.sc:speed.sc                        -0.717  0.085 -0.165 -0.064 -0.006  0.001 -0.055     -0.094    
temptrend_abs.sc:consumerfrac.sc                  0.120 -0.773 -0.069  0.022  0.005 -0.035  0.021      0.127    
temptrend_abs.sc:nspp.sc                         -0.159 -0.046 -0.749  0.118 -0.037  0.195 -0.070     -0.068    
tsign-1:thermal_bias.sc                          -0.006 -0.001 -0.035  0.001 -0.012  0.083  0.050      0.034    
tsign1:thermal_bias.sc                           -0.009 -0.024 -0.044 -0.057  0.000  0.084  0.073      0.084    
temptrend_abs.sc:npp.sc                          -0.064  0.004  0.113 -0.741  0.143 -0.043 -0.103      0.085    
temptrend_abs.sc:veg.sc                           0.010  0.011 -0.024  0.173 -0.733  0.003  0.537     -0.033    
                                                 tm_.:1 tm_.:_. tmptrnd_bs.sc:ss. tmptrnd_bs.sc:mc.
temptrend_abs.sc                                                                                   
REALMMarine                                                                                        
REALMTerrestrial                                                                                   
tsign1                                                                                             
tempave_metab.sc                                                                                   
seas.sc                                                                                            
microclim.sc                                                                                       
mass.sc                                                                                            
speed.sc                                                                                           
consumerfrac.sc                                                                                    
nspp.sc                                                                                            
npp.sc                                                                                             
veg.sc                                                                                             
duration.sc                                                                                        
temptrend_abs.sc:REALMMarine                                                                       
temptrend_abs.sc:REALMTerrestrial                                                                  
temptrend_abs.sc:tsign1                                                                            
temptrend_abs.sc:tempave_metab.sc                 0.052                                            
temptrend_abs.sc:seas.sc                         -0.021  0.109                                     
temptrend_abs.sc:microclim.sc                     0.020 -0.040   0.113                             
temptrend_abs.sc:mass.sc                          0.001  0.168   0.052            -0.043           
temptrend_abs.sc:speed.sc                        -0.035 -0.331  -0.003             0.043           
temptrend_abs.sc:consumerfrac.sc                  0.032 -0.124  -0.063            -0.027           
temptrend_abs.sc:nspp.sc                          0.029 -0.138  -0.040            -0.043           
tsign-1:thermal_bias.sc                          -0.042 -0.114   0.159             0.007           
tsign1:thermal_bias.sc                            0.001 -0.216   0.205             0.042           
temptrend_abs.sc:npp.sc                           0.003  0.030  -0.182            -0.312           
temptrend_abs.sc:veg.sc                           0.052  0.004   0.149             0.028           
                                                 tmptrnd_bs.sc:ms. tmptrnd_bs.sc:sp. tmptrnd_bs.sc:c.
temptrend_abs.sc                                                                                     
REALMMarine                                                                                          
REALMTerrestrial                                                                                     
tsign1                                                                                               
tempave_metab.sc                                                                                     
seas.sc                                                                                              
microclim.sc                                                                                         
mass.sc                                                                                              
speed.sc                                                                                             
consumerfrac.sc                                                                                      
nspp.sc                                                                                              
npp.sc                                                                                               
veg.sc                                                                                               
duration.sc                                                                                          
temptrend_abs.sc:REALMMarine                                                                         
temptrend_abs.sc:REALMTerrestrial                                                                    
temptrend_abs.sc:tsign1                                                                              
temptrend_abs.sc:tempave_metab.sc                                                                    
temptrend_abs.sc:seas.sc                                                                             
temptrend_abs.sc:microclim.sc                                                                        
temptrend_abs.sc:mass.sc                                                                             
temptrend_abs.sc:speed.sc                        -0.475                                              
temptrend_abs.sc:consumerfrac.sc                 -0.043            -0.120                            
temptrend_abs.sc:nspp.sc                          0.003             0.183             0.085          
tsign-1:thermal_bias.sc                           0.021             0.018            -0.005          
tsign1:thermal_bias.sc                            0.007             0.030             0.020          
temptrend_abs.sc:npp.sc                           0.039             0.037            -0.017          
temptrend_abs.sc:veg.sc                           0.004             0.000            -0.011          
                                                 tmptrnd_bs.sc:ns. t-1:_. ts1:_. tmptrnd_bs.sc:np.
temptrend_abs.sc                                                                                  
REALMMarine                                                                                       
REALMTerrestrial                                                                                  
tsign1                                                                                            
tempave_metab.sc                                                                                  
seas.sc                                                                                           
microclim.sc                                                                                      
mass.sc                                                                                           
speed.sc                                                                                          
consumerfrac.sc                                                                                   
nspp.sc                                                                                           
npp.sc                                                                                            
veg.sc                                                                                            
duration.sc                                                                                       
temptrend_abs.sc:REALMMarine                                                                      
temptrend_abs.sc:REALMTerrestrial                                                                 
temptrend_abs.sc:tsign1                                                                           
temptrend_abs.sc:tempave_metab.sc                                                                 
temptrend_abs.sc:seas.sc                                                                          
temptrend_abs.sc:microclim.sc                                                                     
temptrend_abs.sc:mass.sc                                                                          
temptrend_abs.sc:speed.sc                                                                         
temptrend_abs.sc:consumerfrac.sc                                                                  
temptrend_abs.sc:nspp.sc                                                                          
tsign-1:thermal_bias.sc                           0.018                                           
tsign1:thermal_bias.sc                            0.032             0.357                         
temptrend_abs.sc:npp.sc                          -0.114            -0.002  0.055                  
temptrend_abs.sc:veg.sc                           0.017             0.020 -0.012 -0.250           
                                                 tmptrnd_bs.sc:v. tmptrnd_bs.sc:d. h_.:REALM2T h_.:REALM2M t_.:-1
temptrend_abs.sc                                                                                                 
REALMMarine                                                                                                      
REALMTerrestrial                                                                                                 
tsign1                                                                                                           
tempave_metab.sc                                                                                                 
seas.sc                                                                                                          
microclim.sc                                                                                                     
mass.sc                                                                                                          
speed.sc                                                                                                         
consumerfrac.sc                                                                                                  
nspp.sc                                                                                                          
npp.sc                                                                                                           
veg.sc                                                                                                           
duration.sc                                                                                                      
temptrend_abs.sc:REALMMarine                                                                                     
temptrend_abs.sc:REALMTerrestrial                                                                                
temptrend_abs.sc:tsign1                                                                                          
temptrend_abs.sc:tempave_metab.sc                                                                                
temptrend_abs.sc:seas.sc                                                                                         
temptrend_abs.sc:microclim.sc                                                                                    
temptrend_abs.sc:mass.sc                                                                                         
temptrend_abs.sc:speed.sc                                                                                        
temptrend_abs.sc:consumerfrac.sc                                                                                 
temptrend_abs.sc:nspp.sc                                                                                         
tsign-1:thermal_bias.sc                                                                                          
tsign1:thermal_bias.sc                                                                                           
temptrend_abs.sc:npp.sc                                                                                          
temptrend_abs.sc:veg.sc                                                                                          
                                                 t_.:1: t_.:_.:REALM2T
temptrend_abs.sc                                                      
REALMMarine                                                           
REALMTerrestrial                                                      
tsign1                                                                
tempave_metab.sc                                                      
seas.sc                                                               
microclim.sc                                                          
mass.sc                                                               
speed.sc                                                              
consumerfrac.sc                                                       
nspp.sc                                                               
npp.sc                                                                
veg.sc                                                                
duration.sc                                                           
temptrend_abs.sc:REALMMarine                                          
temptrend_abs.sc:REALMTerrestrial                                     
temptrend_abs.sc:tsign1                                               
temptrend_abs.sc:tempave_metab.sc                                     
temptrend_abs.sc:seas.sc                                              
temptrend_abs.sc:microclim.sc                                         
temptrend_abs.sc:mass.sc                                              
temptrend_abs.sc:speed.sc                                             
temptrend_abs.sc:consumerfrac.sc                                      
temptrend_abs.sc:nspp.sc                                              
tsign-1:thermal_bias.sc                                               
tsign1:thermal_bias.sc                                                
temptrend_abs.sc:npp.sc                                               
temptrend_abs.sc:veg.sc                                               
 [ reached getOption("max.print") -- omitted 7 rows ]

Standardized Within-Group Residuals:
        Min          Q1         Med          Q3         Max 
-6.64180587 -0.23617979 -0.02235224  0.26661608  5.42260805 

Number of Observations: 36017
Number of Groups: 
              STUDY_ID rarefyID %in% STUDY_ID 
                   231                  36017 
summary(modTfullJbetarem0)
Linear mixed-effects model fit by REML
 Data: trends[i2, ] 

Random effects:
 Formula: ~temptrend_abs.sc | STUDY_ID
 Structure: General positive-definite, Log-Cholesky parametrization
                 StdDev     Corr  
(Intercept)      0.00722145 (Intr)
temptrend_abs.sc 0.01729128 -0.058

 Formula: ~1 | rarefyID %in% STUDY_ID
        (Intercept)  Residual
StdDev: 0.003744118 0.9597427

Variance function:
 Structure: Power of variance covariate
 Formula: ~nyrBT 
 Parameter estimates:
    power 
-1.892596 
Fixed effects: Jbetatrendrem0 ~ temptrend_abs.sc * REALM + temptrend_abs.sc *      tsign + temptrend_abs.sc * tempave_metab.sc + temptrend_abs.sc *      seas.sc + temptrend_abs.sc * microclim.sc + temptrend_abs.sc *      mass.sc + temptrend_abs.sc * speed.sc + temptrend_abs.sc *      consumerfrac.sc + temptrend_abs.sc * nspp.sc + temptrend_abs.sc *      thermal_bias.sc:tsign + temptrend_abs.sc * npp.sc + temptrend_abs.sc *      veg.sc + temptrend_abs.sc * duration.sc + temptrend_abs.sc *      human_bowler.sc:REALM2 
 Correlation: 
                                                 (Intr) tmpt_. REALMM REALMT tsign1 tmpv_. ses.sc mcrcl. mss.sc
temptrend_abs.sc                                 -0.573                                                        
REALMMarine                                      -0.947  0.551                                                 
REALMTerrestrial                                 -0.752  0.385  0.701                                          
tsign1                                           -0.084  0.047  0.004  0.001                                   
tempave_metab.sc                                  0.100 -0.026 -0.084 -0.244  0.098                            
seas.sc                                          -0.131  0.077  0.178 -0.069 -0.074  0.088                     
microclim.sc                                     -0.078  0.060  0.090  0.022 -0.001 -0.183  0.138              
mass.sc                                           0.095 -0.010 -0.071 -0.043  0.001  0.089  0.091  0.007       
speed.sc                                          0.081 -0.063 -0.041 -0.088 -0.086 -0.110 -0.014  0.039 -0.493
consumerfrac.sc                                  -0.012  0.017  0.010  0.096 -0.022 -0.105 -0.031  0.020  0.012
nspp.sc                                           0.007 -0.032 -0.062 -0.038  0.049 -0.200 -0.033 -0.135 -0.054
npp.sc                                            0.025 -0.013 -0.040  0.032  0.066  0.073 -0.077 -0.140 -0.028
veg.sc                                           -0.442  0.365  0.462  0.011 -0.014 -0.003  0.073 -0.003  0.018
duration.sc                                      -0.041  0.009  0.031 -0.003 -0.144  0.129 -0.003 -0.024 -0.042
temptrend_abs.sc:REALMMarine                      0.554 -0.951 -0.570 -0.361 -0.009  0.023 -0.099 -0.066  0.000
temptrend_abs.sc:REALMTerrestrial                 0.377 -0.740 -0.350 -0.552  0.001  0.148  0.116  0.024 -0.011
temptrend_abs.sc:tsign1                           0.055 -0.127 -0.022  0.002 -0.442 -0.055  0.003 -0.006 -0.004
temptrend_abs.sc:tempave_metab.sc                -0.001  0.056 -0.009  0.132 -0.104 -0.539 -0.130  0.018 -0.066
temptrend_abs.sc:seas.sc                          0.079 -0.108 -0.106  0.104  0.050 -0.090 -0.726 -0.122 -0.063
temptrend_abs.sc:microclim.sc                     0.053 -0.078 -0.061  0.002 -0.009  0.112 -0.091 -0.780  0.012
temptrend_abs.sc:mass.sc                         -0.018  0.040  0.012 -0.009 -0.004 -0.077 -0.056  0.024 -0.577
temptrend_abs.sc:speed.sc                        -0.070  0.093  0.057  0.080  0.074  0.129  0.055 -0.019  0.240
temptrend_abs.sc:consumerfrac.sc                  0.010 -0.032 -0.009 -0.076  0.016  0.077  0.031  0.012  0.003
temptrend_abs.sc:nspp.sc                         -0.023  0.016  0.048  0.045 -0.026  0.119  0.035  0.070  0.011
tsign-1:thermal_bias.sc                           0.066 -0.022 -0.062 -0.049 -0.068  0.135 -0.240 -0.022 -0.040
tsign1:thermal_bias.sc                            0.122 -0.044 -0.126 -0.104  0.066  0.252 -0.437 -0.133 -0.017
temptrend_abs.sc:npp.sc                          -0.002  0.057  0.015 -0.054 -0.040 -0.016  0.065  0.155  0.001
temptrend_abs.sc:veg.sc                           0.351 -0.443 -0.367  0.020 -0.001 -0.016 -0.088 -0.009 -0.010
                                                 spd.sc cnsmr. nspp.s npp.sc veg.sc drtn.s t_.:REALMM t_.:REALMT
temptrend_abs.sc                                                                                                
REALMMarine                                                                                                     
REALMTerrestrial                                                                                                
tsign1                                                                                                          
tempave_metab.sc                                                                                                
seas.sc                                                                                                         
microclim.sc                                                                                                    
mass.sc                                                                                                         
speed.sc                                                                                                        
consumerfrac.sc                                  -0.089                                                         
nspp.sc                                           0.212  0.100                                                  
npp.sc                                            0.163 -0.052 -0.198                                           
veg.sc                                           -0.024 -0.018  0.023 -0.204                                    
duration.sc                                      -0.033  0.012 -0.240  0.077 -0.012                             
temptrend_abs.sc:REALMMarine                      0.039 -0.010  0.063  0.038 -0.386 -0.008                      
temptrend_abs.sc:REALMTerrestrial                 0.076 -0.073  0.049 -0.055  0.021  0.007  0.690               
temptrend_abs.sc:tsign1                           0.033  0.004 -0.025 -0.056 -0.025  0.020  0.040      0.006    
temptrend_abs.sc:tempave_metab.sc                 0.142  0.085  0.123 -0.020 -0.009 -0.054 -0.041     -0.239    
temptrend_abs.sc:seas.sc                          0.014  0.028  0.045  0.090 -0.086 -0.036  0.149     -0.173    
temptrend_abs.sc:microclim.sc                    -0.029 -0.008  0.083  0.167 -0.009  0.011  0.090     -0.058    
temptrend_abs.sc:mass.sc                          0.282  0.015  0.014 -0.015 -0.010  0.055 -0.003      0.016    
temptrend_abs.sc:speed.sc                        -0.601  0.071 -0.148 -0.068  0.004  0.014 -0.042     -0.098    
temptrend_abs.sc:consumerfrac.sc                  0.080 -0.717 -0.065  0.026  0.009 -0.023  0.019      0.109    
temptrend_abs.sc:nspp.sc                         -0.153 -0.045 -0.640  0.108 -0.028  0.167 -0.078     -0.068    
tsign-1:thermal_bias.sc                           0.027  0.006 -0.048  0.004 -0.012  0.085  0.029      0.020    
tsign1:thermal_bias.sc                            0.026 -0.030 -0.081 -0.042  0.000  0.105  0.035      0.057    
temptrend_abs.sc:npp.sc                          -0.085  0.016  0.109 -0.733  0.163 -0.056 -0.093      0.085    
temptrend_abs.sc:veg.sc                           0.006  0.013 -0.026  0.181 -0.813  0.012  0.474     -0.031    
                                                 tm_.:1 tm_.:_. tmptrnd_bs.sc:ss. tmptrnd_bs.sc:mc.
temptrend_abs.sc                                                                                   
REALMMarine                                                                                        
REALMTerrestrial                                                                                   
tsign1                                                                                             
tempave_metab.sc                                                                                   
seas.sc                                                                                            
microclim.sc                                                                                       
mass.sc                                                                                            
speed.sc                                                                                           
consumerfrac.sc                                                                                    
nspp.sc                                                                                            
npp.sc                                                                                             
veg.sc                                                                                             
duration.sc                                                                                        
temptrend_abs.sc:REALMMarine                                                                       
temptrend_abs.sc:REALMTerrestrial                                                                  
temptrend_abs.sc:tsign1                                                                            
temptrend_abs.sc:tempave_metab.sc                 0.047                                            
temptrend_abs.sc:seas.sc                         -0.018  0.080                                     
temptrend_abs.sc:microclim.sc                     0.009  0.029   0.157                             
temptrend_abs.sc:mass.sc                          0.009  0.140   0.042            -0.046           
temptrend_abs.sc:speed.sc                        -0.031 -0.308   0.027             0.032           
temptrend_abs.sc:consumerfrac.sc                  0.018 -0.106  -0.070            -0.031           
temptrend_abs.sc:nspp.sc                          0.024 -0.134  -0.035            -0.050           
tsign-1:thermal_bias.sc                          -0.046 -0.045   0.153             0.009           
tsign1:thermal_bias.sc                            0.016 -0.124   0.210             0.051           
temptrend_abs.sc:npp.sc                           0.025  0.053  -0.193            -0.305           
temptrend_abs.sc:veg.sc                           0.047 -0.014   0.141             0.056           
                                                 tmptrnd_bs.sc:ms. tmptrnd_bs.sc:sp. tmptrnd_bs.sc:c.
temptrend_abs.sc                                                                                     
REALMMarine                                                                                          
REALMTerrestrial                                                                                     
tsign1                                                                                               
tempave_metab.sc                                                                                     
seas.sc                                                                                              
microclim.sc                                                                                         
mass.sc                                                                                              
speed.sc                                                                                             
consumerfrac.sc                                                                                      
nspp.sc                                                                                              
npp.sc                                                                                               
veg.sc                                                                                               
duration.sc                                                                                          
temptrend_abs.sc:REALMMarine                                                                         
temptrend_abs.sc:REALMTerrestrial                                                                    
temptrend_abs.sc:tsign1                                                                              
temptrend_abs.sc:tempave_metab.sc                                                                    
temptrend_abs.sc:seas.sc                                                                             
temptrend_abs.sc:microclim.sc                                                                        
temptrend_abs.sc:mass.sc                                                                             
temptrend_abs.sc:speed.sc                        -0.446                                              
temptrend_abs.sc:consumerfrac.sc                 -0.050            -0.119                            
temptrend_abs.sc:nspp.sc                         -0.002             0.166             0.084          
tsign-1:thermal_bias.sc                           0.019            -0.008            -0.009          
tsign1:thermal_bias.sc                            0.013            -0.009             0.019          
temptrend_abs.sc:npp.sc                           0.047             0.029            -0.021          
temptrend_abs.sc:veg.sc                           0.005             0.012            -0.016          
                                                 tmptrnd_bs.sc:ns. t-1:_. ts1:_. tmptrnd_bs.sc:np.
temptrend_abs.sc                                                                                  
REALMMarine                                                                                       
REALMTerrestrial                                                                                  
tsign1                                                                                            
tempave_metab.sc                                                                                  
seas.sc                                                                                           
microclim.sc                                                                                      
mass.sc                                                                                           
speed.sc                                                                                          
consumerfrac.sc                                                                                   
nspp.sc                                                                                           
npp.sc                                                                                            
veg.sc                                                                                            
duration.sc                                                                                       
temptrend_abs.sc:REALMMarine                                                                      
temptrend_abs.sc:REALMTerrestrial                                                                 
temptrend_abs.sc:tsign1                                                                           
temptrend_abs.sc:tempave_metab.sc                                                                 
temptrend_abs.sc:seas.sc                                                                          
temptrend_abs.sc:microclim.sc                                                                     
temptrend_abs.sc:mass.sc                                                                          
temptrend_abs.sc:speed.sc                                                                         
temptrend_abs.sc:consumerfrac.sc                                                                  
temptrend_abs.sc:nspp.sc                                                                          
tsign-1:thermal_bias.sc                           0.017                                           
tsign1:thermal_bias.sc                            0.025             0.340                         
temptrend_abs.sc:npp.sc                          -0.114             0.006  0.081                  
temptrend_abs.sc:veg.sc                           0.013             0.012 -0.026 -0.281           
                                                 tmptrnd_bs.sc:v. tmptrnd_bs.sc:d. h_.:REALM2T h_.:REALM2M t_.:-1
temptrend_abs.sc                                                                                                 
REALMMarine                                                                                                      
REALMTerrestrial                                                                                                 
tsign1                                                                                                           
tempave_metab.sc                                                                                                 
seas.sc                                                                                                          
microclim.sc                                                                                                     
mass.sc                                                                                                          
speed.sc                                                                                                         
consumerfrac.sc                                                                                                  
nspp.sc                                                                                                          
npp.sc                                                                                                           
veg.sc                                                                                                           
duration.sc                                                                                                      
temptrend_abs.sc:REALMMarine                                                                                     
temptrend_abs.sc:REALMTerrestrial                                                                                
temptrend_abs.sc:tsign1                                                                                          
temptrend_abs.sc:tempave_metab.sc                                                                                
temptrend_abs.sc:seas.sc                                                                                         
temptrend_abs.sc:microclim.sc                                                                                    
temptrend_abs.sc:mass.sc                                                                                         
temptrend_abs.sc:speed.sc                                                                                        
temptrend_abs.sc:consumerfrac.sc                                                                                 
temptrend_abs.sc:nspp.sc                                                                                         
tsign-1:thermal_bias.sc                                                                                          
tsign1:thermal_bias.sc                                                                                           
temptrend_abs.sc:npp.sc                                                                                          
temptrend_abs.sc:veg.sc                                                                                          
                                                 t_.:1: t_.:_.:REALM2T
temptrend_abs.sc                                                      
REALMMarine                                                           
REALMTerrestrial                                                      
tsign1                                                                
tempave_metab.sc                                                      
seas.sc                                                               
microclim.sc                                                          
mass.sc                                                               
speed.sc                                                              
consumerfrac.sc                                                       
nspp.sc                                                               
npp.sc                                                                
veg.sc                                                                
duration.sc                                                           
temptrend_abs.sc:REALMMarine                                          
temptrend_abs.sc:REALMTerrestrial                                     
temptrend_abs.sc:tsign1                                               
temptrend_abs.sc:tempave_metab.sc                                     
temptrend_abs.sc:seas.sc                                              
temptrend_abs.sc:microclim.sc                                         
temptrend_abs.sc:mass.sc                                              
temptrend_abs.sc:speed.sc                                             
temptrend_abs.sc:consumerfrac.sc                                      
temptrend_abs.sc:nspp.sc                                              
tsign-1:thermal_bias.sc                                               
tsign1:thermal_bias.sc                                                
temptrend_abs.sc:npp.sc                                               
temptrend_abs.sc:veg.sc                                               
 [ reached getOption("max.print") -- omitted 7 rows ]

Standardized Within-Group Residuals:
        Min          Q1         Med          Q3         Max 
-8.38434700 -0.32179127 -0.03059932  0.31554016  8.33570233 

Number of Observations: 36017
Number of Groups: 
              STUDY_ID rarefyID %in% STUDY_ID 
                   231                  36017 
summary(modTfullHornrem0)
Linear mixed-effects model fit by REML
 Data: trends[i3, ] 

Random effects:
 Formula: ~temptrend_abs.sc | STUDY_ID
 Structure: General positive-definite, Log-Cholesky parametrization
                 StdDev     Corr  
(Intercept)      0.01556817 (Intr)
temptrend_abs.sc 0.02706589 -0.065

 Formula: ~1 | rarefyID %in% STUDY_ID
        (Intercept) Residual
StdDev:  0.01880474 2.445174

Variance function:
 Structure: Power of variance covariate
 Formula: ~nyrBT 
 Parameter estimates:
    power 
-2.327824 
Fixed effects: Horntrendrem0 ~ temptrend_abs.sc * REALM + temptrend_abs.sc *      tsign + temptrend_abs.sc * tempave_metab.sc + temptrend_abs.sc *      seas.sc + temptrend_abs.sc * microclim.sc + temptrend_abs.sc *      mass.sc + temptrend_abs.sc * speed.sc + temptrend_abs.sc *      consumerfrac.sc + temptrend_abs.sc * nspp.sc + temptrend_abs.sc *      thermal_bias.sc:tsign + temptrend_abs.sc * npp.sc + temptrend_abs.sc *      veg.sc + temptrend_abs.sc * duration.sc + temptrend_abs.sc *      human_bowler.sc:REALM2 
 Correlation: 
                                                 (Intr) tmpt_. REALMM REALMT tsign1 tmpv_. ses.sc mcrcl. mss.sc
temptrend_abs.sc                                 -0.501                                                        
REALMMarine                                      -0.954  0.479                                                 
REALMTerrestrial                                 -0.737  0.361  0.685                                          
tsign1                                           -0.065  0.046 -0.001  0.011                                   
tempave_metab.sc                                  0.101 -0.030 -0.080 -0.245  0.030                            
seas.sc                                          -0.109  0.050  0.157 -0.095 -0.088  0.103                     
microclim.sc                                     -0.067  0.042  0.076  0.017  0.014 -0.185  0.101              
mass.sc                                           0.067 -0.007 -0.044 -0.030 -0.007  0.089  0.096  0.007       
speed.sc                                          0.085 -0.062 -0.039 -0.090 -0.069 -0.078 -0.011  0.059 -0.421
consumerfrac.sc                                  -0.017  0.024  0.010  0.088  0.033 -0.120 -0.052  0.016 -0.014
nspp.sc                                           0.008 -0.037 -0.051 -0.053  0.052 -0.146  0.006 -0.090 -0.060
npp.sc                                            0.026  0.001 -0.038  0.058  0.012  0.024 -0.189 -0.215 -0.036
veg.sc                                           -0.518  0.276  0.536  0.028 -0.012  0.007  0.086  0.005  0.013
duration.sc                                      -0.021  0.012  0.029  0.021 -0.149  0.077 -0.030 -0.022 -0.027
temptrend_abs.sc:REALMMarine                      0.485 -0.949 -0.497 -0.337 -0.014  0.029 -0.069 -0.049 -0.004
temptrend_abs.sc:REALMTerrestrial                 0.322 -0.727 -0.296 -0.510 -0.003  0.161  0.123  0.019 -0.017
temptrend_abs.sc:tsign1                           0.041 -0.112 -0.010  0.003 -0.490 -0.038  0.007 -0.009  0.005
temptrend_abs.sc:tempave_metab.sc                -0.008  0.041 -0.001  0.142 -0.063 -0.500 -0.094  0.047 -0.052
temptrend_abs.sc:seas.sc                          0.059 -0.087 -0.081  0.111  0.052 -0.064 -0.641 -0.093 -0.060
temptrend_abs.sc:microclim.sc                     0.029 -0.045 -0.034  0.002 -0.024  0.103 -0.051 -0.705  0.016
temptrend_abs.sc:mass.sc                         -0.010  0.023  0.005 -0.014  0.012 -0.062 -0.054  0.020 -0.580
temptrend_abs.sc:speed.sc                        -0.047  0.100  0.033  0.075  0.048  0.099  0.041 -0.036  0.222
temptrend_abs.sc:consumerfrac.sc                  0.013 -0.035 -0.012 -0.064 -0.016  0.087  0.031  0.014  0.019
temptrend_abs.sc:nspp.sc                         -0.025  0.029  0.040  0.054 -0.019  0.077  0.011  0.047  0.009
tsign-1:thermal_bias.sc                           0.060 -0.021 -0.056 -0.059 -0.088  0.204 -0.213 -0.040 -0.045
tsign1:thermal_bias.sc                            0.103 -0.035 -0.105 -0.109  0.070  0.342 -0.321 -0.140 -0.016
temptrend_abs.sc:npp.sc                           0.010  0.023 -0.006 -0.055 -0.005 -0.012  0.086  0.158 -0.004
temptrend_abs.sc:veg.sc                           0.306 -0.426 -0.317  0.025 -0.011 -0.024 -0.102  0.009 -0.013
                                                 spd.sc cnsmr. nspp.s npp.sc veg.sc drtn.s t_.:REALMM t_.:REALMT
temptrend_abs.sc                                                                                                
REALMMarine                                                                                                     
REALMTerrestrial                                                                                                
tsign1                                                                                                          
tempave_metab.sc                                                                                                
seas.sc                                                                                                         
microclim.sc                                                                                                    
mass.sc                                                                                                         
speed.sc                                                                                                        
consumerfrac.sc                                  -0.086                                                         
nspp.sc                                           0.179  0.094                                                  
npp.sc                                            0.120 -0.037 -0.198                                           
veg.sc                                           -0.005 -0.003  0.021 -0.163                                    
duration.sc                                       0.011  0.008 -0.241  0.053 -0.006                             
temptrend_abs.sc:REALMMarine                      0.035 -0.018  0.063  0.018 -0.292 -0.016                      
temptrend_abs.sc:REALMTerrestrial                 0.082 -0.062  0.062 -0.057  0.030 -0.014  0.674               
temptrend_abs.sc:tsign1                           0.031 -0.012 -0.021 -0.035 -0.008  0.033  0.035      0.006    
temptrend_abs.sc:tempave_metab.sc                 0.118  0.079  0.088 -0.044 -0.013 -0.016 -0.027     -0.273    
temptrend_abs.sc:seas.sc                          0.013  0.019  0.025  0.125 -0.089 -0.016  0.123     -0.209    
temptrend_abs.sc:microclim.sc                    -0.040 -0.007  0.051  0.172  0.014  0.011  0.057     -0.060    
temptrend_abs.sc:mass.sc                          0.245  0.026  0.011 -0.011 -0.009  0.047  0.012      0.032    
temptrend_abs.sc:speed.sc                        -0.581  0.071 -0.127 -0.042 -0.015 -0.008 -0.043     -0.109    
temptrend_abs.sc:consumerfrac.sc                  0.074 -0.719 -0.063  0.013 -0.001 -0.021  0.023      0.094    
temptrend_abs.sc:nspp.sc                         -0.134 -0.044 -0.615  0.100 -0.021  0.150 -0.081     -0.080    
tsign-1:thermal_bias.sc                           0.004 -0.007 -0.044  0.008 -0.005  0.073  0.027      0.027    
tsign1:thermal_bias.sc                           -0.022 -0.017 -0.065 -0.057 -0.007  0.085  0.028      0.053    
temptrend_abs.sc:npp.sc                          -0.058  0.005  0.098 -0.652  0.098 -0.036 -0.052      0.088    
temptrend_abs.sc:veg.sc                           0.000  0.003 -0.021  0.158 -0.620  0.002  0.456     -0.060    
                                                 tm_.:1 tm_.:_. tmptrnd_bs.sc:ss. tmptrnd_bs.sc:mc.
temptrend_abs.sc                                                                                   
REALMMarine                                                                                        
REALMTerrestrial                                                                                   
tsign1                                                                                             
tempave_metab.sc                                                                                   
seas.sc                                                                                            
microclim.sc                                                                                       
mass.sc                                                                                            
speed.sc                                                                                           
consumerfrac.sc                                                                                    
nspp.sc                                                                                            
npp.sc                                                                                             
veg.sc                                                                                             
duration.sc                                                                                        
temptrend_abs.sc:REALMMarine                                                                       
temptrend_abs.sc:REALMTerrestrial                                                                  
temptrend_abs.sc:tsign1                                                                            
temptrend_abs.sc:tempave_metab.sc                 0.036                                            
temptrend_abs.sc:seas.sc                         -0.027  0.073                                     
temptrend_abs.sc:microclim.sc                     0.005  0.021   0.115                             
temptrend_abs.sc:mass.sc                         -0.003  0.103   0.050            -0.051           
temptrend_abs.sc:speed.sc                        -0.022 -0.285   0.012             0.040           
temptrend_abs.sc:consumerfrac.sc                  0.032 -0.099  -0.060            -0.037           
temptrend_abs.sc:nspp.sc                          0.012 -0.121  -0.028            -0.020           
tsign-1:thermal_bias.sc                          -0.029 -0.061   0.132             0.022           
tsign1:thermal_bias.sc                            0.009 -0.115   0.148             0.048           
temptrend_abs.sc:npp.sc                           0.004  0.077  -0.208            -0.321           
temptrend_abs.sc:veg.sc                           0.054  0.006   0.173             0.006           
                                                 tmptrnd_bs.sc:ms. tmptrnd_bs.sc:sp. tmptrnd_bs.sc:c.
temptrend_abs.sc                                                                                     
REALMMarine                                                                                          
REALMTerrestrial                                                                                     
tsign1                                                                                               
tempave_metab.sc                                                                                     
seas.sc                                                                                              
microclim.sc                                                                                         
mass.sc                                                                                              
speed.sc                                                                                             
consumerfrac.sc                                                                                      
nspp.sc                                                                                              
npp.sc                                                                                               
veg.sc                                                                                               
duration.sc                                                                                          
temptrend_abs.sc:REALMMarine                                                                         
temptrend_abs.sc:REALMTerrestrial                                                                    
temptrend_abs.sc:tsign1                                                                              
temptrend_abs.sc:tempave_metab.sc                                                                    
temptrend_abs.sc:seas.sc                                                                             
temptrend_abs.sc:microclim.sc                                                                        
temptrend_abs.sc:mass.sc                                                                             
temptrend_abs.sc:speed.sc                        -0.394                                              
temptrend_abs.sc:consumerfrac.sc                 -0.060            -0.116                            
temptrend_abs.sc:nspp.sc                          0.007             0.159             0.088          
tsign-1:thermal_bias.sc                           0.020             0.003             0.002          
tsign1:thermal_bias.sc                            0.019             0.011             0.014          
temptrend_abs.sc:npp.sc                           0.052             0.013             0.000          
temptrend_abs.sc:veg.sc                           0.007             0.023            -0.006          
                                                 tmptrnd_bs.sc:ns. t-1:_. ts1:_. tmptrnd_bs.sc:np.
temptrend_abs.sc                                                                                  
REALMMarine                                                                                       
REALMTerrestrial                                                                                  
tsign1                                                                                            
tempave_metab.sc                                                                                  
seas.sc                                                                                           
microclim.sc                                                                                      
mass.sc                                                                                           
speed.sc                                                                                          
consumerfrac.sc                                                                                   
nspp.sc                                                                                           
npp.sc                                                                                            
veg.sc                                                                                            
duration.sc                                                                                       
temptrend_abs.sc:REALMMarine                                                                      
temptrend_abs.sc:REALMTerrestrial                                                                 
temptrend_abs.sc:tsign1                                                                           
temptrend_abs.sc:tempave_metab.sc                                                                 
temptrend_abs.sc:seas.sc                                                                          
temptrend_abs.sc:microclim.sc                                                                     
temptrend_abs.sc:mass.sc                                                                          
temptrend_abs.sc:speed.sc                                                                         
temptrend_abs.sc:consumerfrac.sc                                                                  
temptrend_abs.sc:nspp.sc                                                                          
tsign-1:thermal_bias.sc                           0.014                                           
tsign1:thermal_bias.sc                            0.022             0.393                         
temptrend_abs.sc:npp.sc                          -0.100            -0.016  0.045                  
temptrend_abs.sc:veg.sc                           0.012             0.015 -0.016 -0.242           
                                                 tmptrnd_bs.sc:v. tmptrnd_bs.sc:d. h_.:REALM2T h_.:REALM2M t_.:-1
temptrend_abs.sc                                                                                                 
REALMMarine                                                                                                      
REALMTerrestrial                                                                                                 
tsign1                                                                                                           
tempave_metab.sc                                                                                                 
seas.sc                                                                                                          
microclim.sc                                                                                                     
mass.sc                                                                                                          
speed.sc                                                                                                         
consumerfrac.sc                                                                                                  
nspp.sc                                                                                                          
npp.sc                                                                                                           
veg.sc                                                                                                           
duration.sc                                                                                                      
temptrend_abs.sc:REALMMarine                                                                                     
temptrend_abs.sc:REALMTerrestrial                                                                                
temptrend_abs.sc:tsign1                                                                                          
temptrend_abs.sc:tempave_metab.sc                                                                                
temptrend_abs.sc:seas.sc                                                                                         
temptrend_abs.sc:microclim.sc                                                                                    
temptrend_abs.sc:mass.sc                                                                                         
temptrend_abs.sc:speed.sc                                                                                        
temptrend_abs.sc:consumerfrac.sc                                                                                 
temptrend_abs.sc:nspp.sc                                                                                         
tsign-1:thermal_bias.sc                                                                                          
tsign1:thermal_bias.sc                                                                                           
temptrend_abs.sc:npp.sc                                                                                          
temptrend_abs.sc:veg.sc                                                                                          
                                                 t_.:1: t_.:_.:REALM2T
temptrend_abs.sc                                                      
REALMMarine                                                           
REALMTerrestrial                                                      
tsign1                                                                
tempave_metab.sc                                                      
seas.sc                                                               
microclim.sc                                                          
mass.sc                                                               
speed.sc                                                              
consumerfrac.sc                                                       
nspp.sc                                                               
npp.sc                                                                
veg.sc                                                                
duration.sc                                                           
temptrend_abs.sc:REALMMarine                                          
temptrend_abs.sc:REALMTerrestrial                                     
temptrend_abs.sc:tsign1                                               
temptrend_abs.sc:tempave_metab.sc                                     
temptrend_abs.sc:seas.sc                                              
temptrend_abs.sc:microclim.sc                                         
temptrend_abs.sc:mass.sc                                              
temptrend_abs.sc:speed.sc                                             
temptrend_abs.sc:consumerfrac.sc                                      
temptrend_abs.sc:nspp.sc                                              
tsign-1:thermal_bias.sc                                               
tsign1:thermal_bias.sc                                                
temptrend_abs.sc:npp.sc                                               
temptrend_abs.sc:veg.sc                                               
 [ reached getOption("max.print") -- omitted 7 rows ]

Standardized Within-Group Residuals:
        Min          Q1         Med          Q3         Max 
-5.67542034 -0.23386259 -0.02454167  0.23164547  5.75602618 

Number of Observations: 35327
Number of Groups: 
              STUDY_ID rarefyID %in% STUDY_ID 
                   200                  35327 
rsquared(modTfullJturem0)
rsquared(modTfullJbetarem0)
rsquared(modTfullHornrem0)
NA

Plots from the full models

Plot the coefficients


coefs1 <- summary(modTfullJturem0)$tTable
coefs2 <- summary(modTfullJbetarem0)$tTable
coefs3 <- summary(modTfullHornrem0)$tTable

varstoplot <- unique(c(rownames(coefs1), rownames(coefs2), rownames(coefs3)))
varstoplot <- varstoplot[which(!grepl('Intercept', varstoplot) | grepl(':', varstoplot))] # vars to plot

rows1_1 <- which(rownames(coefs1) %in% varstoplot) # rows in coefs
rows1_2 <- which(rownames(coefs2) %in% varstoplot)
rows1_3 <- which(rownames(coefs3) %in% varstoplot)
xlims <- range(c(coefs1[rows1_1,1] - coefs1[rows1_1,2], coefs1[rows1_1,1] + coefs1[rows1_1,2], 
                  coefs2[rows1_2,1] - coefs2[rows1_2,2], coefs2[rows1_2,1] + coefs2[rows1_2,2], 
                  coefs3[rows1_3,1] - coefs3[rows1_3,2], coefs3[rows1_3,1] + coefs3[rows1_3,2]))


cols <- brewer.pal(3, 'Dark2') # for Jtu, Jbeta and Horn models
pchs <- c(16, 16, 16)
offs <- c(0.1, 0, -0.1) # offset vertically for each model


par(las = 1, mai = c(0.5, 4, 0.1, 0.1))

plot(0,0, col = 'white', xlim = xlims, ylim = c(1,length(varstoplot)), yaxt='n', xlab = '', ylab ='')
axis(2, at = length(varstoplot):1, labels = varstoplot, cex.axis = 0.7)
abline(v = 0, col = 'grey', lty = 2)
abline(h = 1:length(varstoplot), col = 'grey', lty = 3)
for(i in 1:length(varstoplot)){
  if(varstoplot[i] %in% rownames(coefs1)){
    x = coefs1[rownames(coefs1) == varstoplot[i], 1]
    se = coefs1[rownames(coefs1) == varstoplot[i], 2]
    points(x, length(varstoplot) + 1 - i + offs[1], pch = pchs[1], col = cols[1])
    lines(x = c(x-se, x+se), y = c(length(varstoplot) + 1 - i + offs[1], length(varstoplot) + 1 - i + offs[1]), col = cols[1])
  }
  if(varstoplot[i] %in% rownames(coefs2)){
    x = coefs2[rownames(coefs2) == varstoplot[i], 1]
    se = coefs2[rownames(coefs2) == varstoplot[i], 2]
    points(x, length(varstoplot) + 1 - i + offs[2], pch = pchs[2], col = cols[2])
    lines(x = c(x-se, x+se), y = c(length(varstoplot) + 1 - i + offs[2], length(varstoplot) + 1 - i + offs[2]), col = cols[2])
  }
  if(varstoplot[i] %in% rownames(coefs3)){
    x = coefs3[rownames(coefs3) == varstoplot[i], 1]
    se = coefs3[rownames(coefs3) == varstoplot[i], 2]
    points(x, length(varstoplot) + 1 - i + offs[3], pch = pchs[3], col = cols[3])
    lines(x = c(x-se, x+se), y = c(length(varstoplot) + 1 - i + offs[3], length(varstoplot) + 1 - i + offs[3]), col = cols[3])
  }
}
legend('topleft', col = cols, pch = 16, lwd = 1, legend = c('Jtu', 'Jbeta', 'Horn'), cex = 0.5)

Plot the main effects

Manually

# set up the variables to plot
# if variable is logged before scaling (see 'center and scale' above), then need to mark it here and express the limits on a log10 scale (even though log transforming is log)
vars <- data.frame(vars = c('temptrend_abs', 'tempave_metab', 'seas', 'microclim', 'mass', 'speed', 
                            'consumerfrac', 'nspp', 'thermal_bias', 'npp', 'veg', 'duration', 
                            'human_bowler', 'human_bowler'),
           min =      c(0,  0,   0.1, -2,  0,   0,   0,   0.3, -10, 1.9, 0,   0.5, 0,   0), 
           max =      c(2,  30,  16,  0.8, 8,   2,   1,   2.6, 10,  3.7, 0.3, 2,   1,   1),
           log =      c(F,  F,   F,   T,   T,   T,   F,   T,   F,   T,   T,   T,   T,   T),
           len =      c(100,  100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100),
           discrete = c(F,  F,   F,   F,   F,   F,   F,   F,   F,   F,   F,   F,   F,   F),
           plus =     c(0,  0,   0,   0,   0,   1,   0,   0,   0,   0,   1,   0,   1,   1), # what to add before log-scaling
           REALM = c(rep('Terrestrial', 13), 'Marine'),
           REALM2 = c(rep('TerrFresh', 13), 'Marine'),
           stringsAsFactors = FALSE)
baseall <- trends[, .(type = 'all', 
                      temptrend = -0.0001,
                      temptrend_abs.sc = 0.0001,
                      tempave_metab.sc = mean(tempave_metab.sc, na.rm=TRUE), 
                      seas.sc = mean(seas.sc, na.rm=TRUE), 
                      microclim.sc = mean(microclim.sc, na.rm=TRUE), 
                      speed.sc = mean(speed.sc, na.rm=TRUE), 
                      mass.sc = mean(mass.sc, na.rm=TRUE), 
                      nspp.sc = 0, 
                      thermal_bias.sc = mean(thermal_bias.sc, na.rm=TRUE), 
                      npp.sc = mean(npp.sc, na.rm=TRUE), 
                      human_bowler.sc = mean(human_bowler.sc, na.rm=TRUE), 
                      veg.sc = mean(veg.sc, na.rm=TRUE), 
                      consumerfrac.sc = mean(consumerfrac.sc, na.rm=TRUE))]
baseterr <- trends[REALM == 'Terrestrial', 
                   .(type = 'Terrestrial', 
                     temptrend = -0.0001,
                     temptrend_abs.sc = 0.0001,
                     tempave_metab.sc = mean(tempave_metab.sc, na.rm=TRUE), 
                     seas.sc = mean(seas.sc, na.rm=TRUE), 
                     microclim.sc = mean(microclim.sc, na.rm=TRUE), 
                     speed.sc = mean(speed.sc, na.rm=TRUE), 
                     mass.sc = mean(mass.sc, na.rm=TRUE), 
                     nspp.sc = 0, 
                     thermal_bias.sc = 0, 
                     npp.sc = mean(npp.sc, na.rm=TRUE), 
                     human_bowler.sc = mean(human_bowler.sc, na.rm=TRUE), 
                     veg.sc = mean(veg.sc, na.rm=TRUE), 
                     consumerfrac.sc = mean(consumerfrac.sc, na.rm=TRUE))]
basemar <- trends[REALM == 'Marine', 
                  .(type = 'Marine',
                    temptrend = -0.0001,
                    temptrend_abs.sc = 0.0001,
                    tempave_metab.sc = mean(tempave_metab.sc, na.rm=TRUE), 
                    seas.sc = mean(seas.sc, na.rm=TRUE), 
                    microclim.sc = mean(microclim.sc, na.rm=TRUE), 
                    speed.sc = mean(speed.sc, na.rm=TRUE), 
                    mass.sc = mean(mass.sc, na.rm=TRUE), 
                    nspp.sc = 0, 
                    thermal_bias.sc = 0, 
                    npp.sc = mean(npp.sc, na.rm=TRUE), 
                    human_bowler.sc = mean(human_bowler.sc, na.rm=TRUE), 
                    veg.sc = mean(veg.sc, na.rm=TRUE), 
                    consumerfrac.sc = mean(consumerfrac.sc, na.rm=TRUE))]
basetab <- rbind(baseall, baseterr, basemar)
basetab[, ':='(duration.sc = 0, nyrBT = 20, STUDY_ID = 127L, rarefyID = '127_514668')]

# make the data frames for each interaction to plot                
for(j in 1:nrow(vars)){
  # set up the main effects
  if(vars$log[j]){
    thisdat <- data.frame(new = 10^seq(vars$min[j], vars$max[j], length.out = vars$len[j]),
                          var = vars$vars[j], stringsAsFactors = FALSE)
  } 
  if(!vars$log[j]){
    thisdat <- data.frame(new = seq(vars$min[j], vars$max[j], length.out = vars$len[j]),
                          var = vars$vars[j], stringsAsFactors = FALSE)
  }
  names(thisdat) <- c(vars$vars[j], 'var')

  # scale the variable
  cent <- attr(trends[[paste0(vars$vars[j], '.sc')]], 'scaled:center')
  scl <- attr(trends[[paste0(vars$vars[j], '.sc')]], 'scaled:scale')
  if(is.null(cent)) cent <- 0
  if(!is.null(cent) & !is.null(scl)){
    if(vars$log[j]) thisdat[[paste0(vars$var[j], '.sc')]] <- (log(thisdat[[vars$vars[j]]] + vars$plus[j]) - cent)/scl
    if(!vars$log[j]) thisdat[[paste0(vars$var[j], '.sc')]] <- (thisdat[[vars$var[j]]] - cent)/scl
  }

  # merge with the rest of the columns
  # use realm-specific averages for human impacts
  if(vars$vars[j] != 'tsign') colnamestouse <- setdiff(colnames(basetab), paste0(vars$vars[j], '.sc'))
  if(vars$vars[j] == 'tsign') colnamestouse <- setdiff(colnames(basetab), vars$var[j])
  if(vars$vars[j] != 'human_bowler'){
    thisdat <- cbind(thisdat, basetab[type == 'all', ..colnamestouse])
  }
  if(vars$vars[j] == 'human_bowler' & vars$REALM[j] == 'Terrestrial'){
    thisdat <- cbind(thisdat, basetab[type == 'Terrestrial', ..colnamestouse])
  }
  if(vars$vars[j] == 'human_bowler' & vars$REALM[j] == 'Marine'){
    thisdat <- cbind(thisdat, basetab[type == 'Marine', ..colnamestouse])
  }
  
  # add realm
  thisdat$REALM <- vars$REALM[j]
  thisdat$REALM2 <- vars$REALM2[j]
  
  # merge with the previous iterations
  if(j == 1) newdat <- thisdat
  if(j > 1){
    colstoadd <- setdiff(colnames(thisdat), colnames(newdat))
    for(toadd in colstoadd){
      newdat[[toadd]] <- NA
    }
    
    colstoadd2 <- setdiff(colnames(newdat), colnames(thisdat))
    for(toadd in colstoadd2){
      thisdat[[toadd]] <- NA
    }
    
    newdat <- rbind(newdat, thisdat)
  } 
}

# character so that new levels can be added
newdat$REALM <- as.character(newdat$REALM)
newdat$REALM2 <- as.character(newdat$REALM2)

# add extra rows so that all factor levels are represented (for predict.lme to work)
newdat <- rbind(newdat[1:6, ], newdat)
newdat$REALM[1:6] <- c('Marine', 'Marine', 'Freshwater', 'Freshwater', 'Terrestrial', 'Terrestrial')
newdat$REALM2[1:6] <- c('Marine', 'Marine', 'TerrFresh', 'TerrFresh', 'TerrFresh', 'TerrFresh')
newdat$temptrend_abs.sc[1:6] <- rep(0.0001, 6)
newdat$temptrend[1:6] <- rep(c(0.0001, -0.0001), 3)
newdat$var[1:6] <- 'test'

# trim to at least some temperature change (so that tsign is -1 or 1)
newdat <- newdat[newdat$temptrend_abs.sc != 0,]

# set up tsign
newdat$tsign <- factor(sign(newdat$temptrend))


# make predictions
newdat$predsJtu <- predict(object = modTfullJturem0, newdata = newdat, level = 0)
newdat$predsJbeta <- predict(object = modTfullJbetarem0, newdata = newdat, level = 0)
newdat$predsHorn <- predict(object = modTfullHornrem0, newdata = newdat, level = 0)

#compute standard error for predictions
# from https://stackoverflow.com/questions/14358811/extract-prediction-band-from-lme-fit
DesignmatJtu <- model.matrix(eval(eval(modTfullJturem0$call$fixed)[-2]), newdat)
DesignmatJbeta <- model.matrix(eval(eval(modTfullJbetarem0$call$fixed)[-2]), newdat)
DesignmatHorn <- model.matrix(eval(eval(modTfullHornrem0$call$fixed)[-2]), newdat)

predvarJtu <- diag(DesignmatJtu %*% modTfullJturem0$varFix %*% t(DesignmatJtu))
predvarJbeta <- diag(DesignmatJbeta %*% modTfullJbetarem0$varFix %*% t(DesignmatJbeta))
predvarHorn <- diag(DesignmatHorn %*% modTfullHornrem0$varFix %*% t(DesignmatHorn))

newdat$SE_Jtu <- sqrt(predvarJtu) 
newdat$SE_Jbeta <- sqrt(predvarJbeta) 
newdat$SE_Horn <- sqrt(predvarHorn) 

# prep the plots
varplots <- vector('list', nrow(vars))
for(j in 1:length(varplots)){
  subs <- newdat$var == vars$vars[j] # which rows of newdat
  xvar <- vars$vars[j]
  title <- vars$vars[j]
  if(vars$vars[j] %in% c('human_bowler')){
    subs <- newdat$var == vars$vars[j] & newdat$REALM2 == vars$REALM2[j]
    title <- paste0('human:', vars$REALM2[j])
  } 

  se <- 1
  thisplot <- ggplot(newdat[subs, ], 
                     aes_string(x = xvar, y = 'predsJtu')) +
    geom_line() +
    geom_ribbon(aes(ymin = predsJtu - se*SE_Jtu, ymax = predsJtu + se*SE_Jtu), alpha = 0.5, fill = "grey") +
    geom_line(aes(y = predsJbeta), color = 'red') +
    geom_ribbon(aes(ymin = predsJbeta - se*SE_Jbeta, ymax = predsJbeta + se*SE_Jbeta), alpha = 0.5, fill = "red") +
    geom_line(aes(y = predsHorn), color = 'blue') +
    geom_ribbon(aes(ymin = predsHorn - se*SE_Horn, ymax = predsHorn + se*SE_Horn), alpha = 0.5, fill = "blue") +
    #coord_cartesian(ylim = c(0, 0.4)) +
    theme(plot.margin = unit(c(0.5,0,0.5,0), 'cm')) +
    labs(title = title) 
  varplots[[j]] <- thisplot
  if(vars$log[j] & !vars$discrete[j]){
    varplots[[j]] <- thisplot + scale_x_log10()
  }
}

grid.arrange(grobs = varplots, ncol = 3)


# write out the interactions
write.csv(newdat, file = 'output/maineffects.csv')
Using sjPlot

Doesn’t work now

require(sjPlot)
# p1 <- sjPlot::plot_model(modTfullJturem0, type = 'est', terms = c('temptrend_abs.sc'))

Plot interactions (Jaccard turnover)


# set up the interactions to plot
# if variable is logged before scaling (see 'center and scale' above), then need to mark it here and express the limits on a log10 scale (even though log transforming is log)
ints <- data.frame(vars = c('tsign', 'tempave_metab', 'seas', 'microclim', 'mass', 'speed', 
                            'consumerfrac', 'nspp', 'thermal_bias', 'npp', 'veg', 'duration', 
                            'human_bowler', 'human_bowler'),
           min =      c(1,  0,   0.1, -2,  0,   0,   0,   0.3, -10, 1.9, 0,   0.5, 0,   0), 
           max =      c(2,  30,  16,  0.8, 8,   2,   1,   2.6, 10,  3.7, 0.3, 2,   1,   1),
           log =      c(F,  F,   F,   T,   T,   T,   F,   T,   F,   T,   T,   T,   T,   T),
           len =      c(2,  100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100),
           discrete = c(T,  F,   F,   F,   F,   F,   F,   F,   F,   F,   F,   F,   F,   F),
           plus =     c(0,  0,   0,   0,   0,   1,   0,   0,   0,   0,   1,   0,   1,   1), # what to add before log-scaling
           REALM = c(rep('Terrestrial', 12), 'Terrestrial', 'Marine'),
           REALM2 = c(rep('TerrFresh', 13), 'Marine'),
           stringsAsFactors = FALSE)
baseall <- trends[, .(type = 'all', tempave_metab.sc = mean(tempave_metab.sc, na.rm=TRUE), 
                      seas.sc = mean(seas.sc, na.rm=TRUE), 
                      microclim.sc = mean(microclim.sc, na.rm=TRUE), 
                      speed.sc = mean(speed.sc, na.rm=TRUE), 
                      mass.sc = mean(mass.sc, na.rm=TRUE), 
                      nspp.sc = 0, 
                      thermal_bias.sc = mean(thermal_bias.sc, na.rm=TRUE), 
                      npp.sc = mean(npp.sc, na.rm=TRUE), 
                      human_bowler.sc = mean(human_bowler.sc, na.rm=TRUE), 
                      veg.sc = mean(veg.sc, na.rm=TRUE), 
                      consumerfrac.sc = mean(consumerfrac.sc, na.rm=TRUE))]
baseterr <- trends[REALM == 'Terrestrial', 
                   .(type = 'Terrestrial', 
                     tempave_metab.sc = mean(tempave_metab.sc, na.rm=TRUE), 
                     seas.sc = mean(seas.sc, na.rm=TRUE), 
                     microclim.sc = mean(microclim.sc, na.rm=TRUE), 
                     speed.sc = mean(speed.sc, na.rm=TRUE), 
                     mass.sc = mean(mass.sc, na.rm=TRUE), 
                     nspp.sc = 0, 
                     thermal_bias.sc = 0, 
                     npp.sc = mean(npp.sc, na.rm=TRUE), 
                     human_bowler.sc = mean(human_bowler.sc, na.rm=TRUE), 
                     veg.sc = mean(veg.sc, na.rm=TRUE), 
                     consumerfrac.sc = mean(consumerfrac.sc, na.rm=TRUE))]
basemar <- trends[REALM == 'Marine', 
                  .(type = 'Marine',
                    tempave_metab.sc = mean(tempave_metab.sc, na.rm=TRUE), 
                    seas.sc = mean(seas.sc, na.rm=TRUE), 
                    microclim.sc = mean(microclim.sc, na.rm=TRUE), 
                    speed.sc = mean(speed.sc, na.rm=TRUE), 
                    mass.sc = mean(mass.sc, na.rm=TRUE), 
                    nspp.sc = 0, 
                    thermal_bias.sc = 0, 
                    npp.sc = mean(npp.sc, na.rm=TRUE), 
                    human_bowler.sc = mean(human_bowler.sc, na.rm=TRUE), 
                    veg.sc = mean(veg.sc, na.rm=TRUE), 
                    consumerfrac.sc = mean(consumerfrac.sc, na.rm=TRUE))]
basetab <- rbind(baseall, baseterr, basemar)
basetab[, ':='(duration.sc = 0, nyrBT = 20, STUDY_ID = 127L, rarefyID = '127_514668')]

# make the data frames for each interaction to plot                
for(j in 1:nrow(ints)){
  # set up a grid of temperature trends and the interacting variable
  if(ints$log[j]) intvars <- list(temptrend = seq(-1.5, 1.5, length.out = 100), 
                                  new = 10^seq(ints$min[j], ints$max[j], length.out = ints$len[j]),
                                   var = ints$vars[j])
  if(!ints$log[j]) intvars <- list(temptrend = seq(-1.5, 1.5, length.out = 100), 
                                   new = seq(ints$min[j], ints$max[j], length.out = ints$len[j]),
                                   var = ints$vars[j])
  names(intvars) <- c('temptrend', ints$vars[j], 'var')
  thisdat <- expand.grid(intvars)
  
  # scale the interacting variable
  cent <- attr(trends[[paste0(ints$var[j], '.sc')]], 'scaled:center')
  scl <- attr(trends[[paste0(ints$var[j], '.sc')]], 'scaled:scale')
  if(!is.null(cent) & !is.null(scl)){
    if(ints$log[j]) thisdat[[paste0(ints$var[j], '.sc')]] <- (log(thisdat[[ints$vars[j]]] + ints$plus[j]) - cent)/scl
    if(!ints$log[j]) thisdat[[paste0(ints$var[j], '.sc')]] <- (thisdat[[ints$var[j]]] - cent)/scl
  }

  # merge with the rest of the columns
  # use realm-specific averages for human impacts
  if(ints$vars[j] != 'tsign') colnamestouse <- setdiff(colnames(basetab), paste0(ints$var[j], '.sc'))
  if(ints$vars[j] == 'tsign') colnamestouse <- setdiff(colnames(basetab), ints$var[j])
  if(ints$vars[j] != 'human_bowler'){
    thisdat <- cbind(thisdat, basetab[type == 'all', ..colnamestouse])
  }
  if(ints$vars[j] == 'human_bowler' & ints$REALM[j] == 'Terrestrial'){
    thisdat <- cbind(thisdat, basetab[type == 'Terrestrial', ..colnamestouse])
  }
  if(ints$vars[j] == 'human_bowler' & ints$REALM[j] == 'Marine'){
    thisdat <- cbind(thisdat, basetab[type == 'Marine', ..colnamestouse])
  }
  
  # add realm
  thisdat$REALM <- ints$REALM[j]
  thisdat$REALM2 <- ints$REALM2[j]
  
  # merge with the previous iterations
  if(j == 1) newdat <- thisdat
  if(j > 1){
    colstoadd <- setdiff(colnames(thisdat), colnames(newdat))
    for(toadd in colstoadd){
      newdat[[toadd]] <- NA
    }
    
    colstoadd2 <- setdiff(colnames(newdat), colnames(thisdat))
    for(toadd in colstoadd2){
      thisdat[[toadd]] <- NA
    }
    
    newdat <- rbind(newdat, thisdat)
  } 
}

# character so that new levels can be added
newdat$REALM <- as.character(newdat$REALM)
newdat$REALM2 <- as.character(newdat$REALM2)

# add extra rows so that all factor levels are represented (for predict.lme to work)
newdat <- rbind(newdat[1:6, ], newdat)
newdat$REALM[1:6] <- c('Marine', 'Marine', 'Freshwater', 'Freshwater', 'Terrestrial', 'Terrestrial')
newdat$REALM2[1:6] <- c('Marine', 'Marine', 'TerrFresh', 'TerrFresh', 'TerrFresh', 'TerrFresh')
newdat$temptrend[1:6] <- c(-1, 1, -1, 1, -1, 1)

# trim to at least some temperature change (so that tsign is -1 or 1)
newdat <- newdat[newdat$temptrend != 0,]

# scale the temperature vars
newdat$temptrend.sc <- newdat$temptrend/attr(trends$temptrend.sc, 'scaled:scale') 
newdat$temptrend_abs <- abs(newdat$temptrend)
newdat$temptrend_abs.sc <- (newdat$temptrend_abs)/attr(trends$temptrend_abs.sc, 'scaled:scale')
newdat$tsign <- factor(sign(newdat$temptrend))

# make predictions
newdat$preds <- predict(object = modTfullJturem0, newdata = newdat, level = 0)

#remove the extra rows
newdat <- newdat[5:nrow(newdat), ]

# prep the plots
intplots <- vector('list', nrow(ints))
for(j in 1:length(intplots)){
  subs <- newdat$var == ints$vars[j] & newdat$temptrend > 0 # select warming side
  xvar <- 'temptrend_abs'
  title <- ints$vars[j]
  if(ints$vars[j] %in% c('tsign')){
    subs <- newdat$var == ints$vars[j]
  } 
  if(ints$vars[j] %in% c('thermal_bias')){
    subs <- newdat$var == ints$vars[j]
    xvar <- 'temptrend'
  } 
  if(ints$vars[j] %in% c('human_bowler')){
    subs <- newdat$var == ints$vars[j] & newdat$temptrend > 0 & newdat$REALM2 == ints$REALM2[j]
    title <- paste0('human:', ints$REALM2[j])
  } 

  thisplot <- ggplot(newdat[subs, ], 
                     aes_string(x = xvar, y = 'preds', 
                                group = ints$vars[j], 
                                color = ints$vars[j])) +
    geom_line() +
    coord_cartesian(ylim = c(-0.2, 0.4)) +
    theme(plot.margin = unit(c(0.5,0,0.5,0), 'cm')) +
    labs(title = title)
  if(ints$log[j] & !ints$discrete[j]){
    intplots[[j]] <- thisplot + scale_color_distiller(palette = "YlGnBu", trans = 'log')
  }
  if(!ints$log[j] & !ints$discrete[j]){
    intplots[[j]] <- thisplot + scale_color_distiller(palette = "YlGnBu", trans = 'identity')
  }
  if(ints$discrete[j]){
    intplots[[j]] <- thisplot + scale_color_brewer(palette = "Dark2")
  }
}

#grid.arrange(grobs = intplots, '+', theme(plot.margin = unit(c(0,0,0,0), 'cm'))), ncol=2)
#do.call('grid.arrange', c(intplots, ncol = 2))
grid.arrange(grobs = intplots, ncol = 3)

# write out the interactions
write.csv(newdat, file = 'temp/interactions.csv')

Plot residuals against each predictor (Jaccard turnover)

resids <- resid(modTfullJturem0)
preds <- getData(modTfullJturem0)
col = '#00000033'
cex = 0.5
par(mfrow = c(5,4))
boxplot(resids ~ preds$REALM, cex = cex, col = col)
plot(preds$temptrend_abs.sc, resids, cex = cex, col = col)
plot(preds$tsign, resids, cex = cex, col = col)
plot(preds$tempave.sc, resids, cex = cex, col = col)
plot(preds$tempave_metab.sc, resids, cex = cex, col = col)
plot(preds$seas.sc, resids, cex = cex, col = col)
plot(preds$microclim.sc, resids, cex = cex, col = col)
plot(preds$mass.sc, resids, cex = cex, col = col)
plot(preds$speed.sc, resids, cex = cex, col = col)
plot(preds$lifespan.sc, resids, cex = cex, col = col)
plot(preds$consumerfrac.sc, resids, cex = cex, col = col)
plot(preds$endothermfrac.sc, resids, cex = cex, col = col)
plot(preds$nspp.sc, resids, cex = cex, col = col)
plot(preds$thermal_bias.sc, resids, cex = cex, col = col)
plot(preds$npp.sc, resids, cex = cex, col = col)
plot(preds$veg.sc, resids, cex = cex, col = col)
plot(preds$human_bowler.sc, resids, cex = cex, col = col)

Remove each term from the full model

Plot deltaAICs for all 3 models

# transform for a plot
aicsfromfulllong <- reshape(aicsfromfull, direction = 'long',
                            varying = c('dAIC_Jtu', 'dAIC_Jbeta', 'dAIC_Horn'),
                            v.names = 'dAIC',
                            idvar = 'mod',
                            timevar = 'type',
                            times = c('Jtu', 'Jbeta', 'Horn'))

trans = function(x) sign(x)*sqrt(abs(x))
aicsfromfulllong$dAIC_tr <- trans(aicsfromfulllong$dAIC)

# plot
xlims <- range(aicsfromfulllong$dAIC_tr, na.rm = TRUE)
xticks <- c(-10, 0, 10, 100, 1000, 10000)
par(mai = c(0.5, 3, 0.1, 0.1))
with(aicsfromfulllong[aicsfromfulllong$type == 'Jtu',], plot(dAIC_tr, nrow(aicsfromfull):1, 
                                                           col = 'light grey', xlim = xlims, yaxt = 'n', ylab = '', xaxt = 'n'))
with(aicsfromfulllong[aicsfromfulllong$type == 'Jbeta',], points(dAIC_tr, nrow(aicsfromfull):1 - 0.1, col = 'dark grey'))
with(aicsfromfulllong[aicsfromfulllong$type == 'Horn',], points(dAIC_tr, nrow(aicsfromfull):1 - 0.2, col = 'black'))
axis(2, at = nrow(aicsfromfull):1, labels = aicsfromfull$mod, las = 1, cex.axis = 0.7)
axis(1, at = trans(xticks), labels = xticks, cex.axis = 0.5)
abline(v = 0, lty =2, col = 'grey')

Light grey is for Jaccard turnover, dark grey is for Jaccard total, black is for Morisita-Horn. Clear that removing temperature trend makes the model quite a bit worse and has the biggest effect.

Simplify the full models

This takes a couple days on a laptop to run if temp/ files not available.

i1 <- trends[, complete.cases(Jtutrendrem0, REALM, tempave_metab.sc, seas.sc, microclim.sc, 
                             temptrend_abs.sc, mass.sc, speed.sc, 
                             consumerfrac.sc, nspp.sc, thermal_bias.sc, npp.sc, 
                             veg.sc, duration.sc, human_bowler.sc)]
i2 <- trends[, complete.cases(Jbetatrendrem0, REALM, tempave_metab.sc, seas.sc, microclim.sc, 
                             temptrend_abs.sc, mass.sc, speed.sc, 
                             consumerfrac.sc, nspp.sc, thermal_bias.sc, npp.sc, 
                             veg.sc, duration.sc, human_bowler.sc)]
i3 <- trends[, complete.cases(Horntrendrem0, REALM, tempave_metab.sc, seas.sc, microclim.sc, 
                             temptrend_abs.sc, mass.sc, speed.sc, 
                             consumerfrac.sc, nspp.sc, thermal_bias.sc, npp.sc, 
                             veg.sc, duration.sc, human_bowler.sc)]

randef <- list(STUDY_ID = ~ temptrend_abs.sc, rarefyID = ~1)
varef <- varPower(-0.5, ~nyrBT)

# simplify the full models
if(file.exists('temp/modTsimpJturem0.rds')){
  modTsimpJturem0 <- readRDS('temp/modTsimpJturem0.rds')
} else {
  modTfullJturem0ML <- lme(Jtutrendrem0 ~ temptrend_abs.sc*REALM + 
                         temptrend_abs.sc*tsign +
                         temptrend_abs.sc*tempave_metab.sc + 
                         temptrend_abs.sc*seas.sc + 
                         temptrend_abs.sc*microclim.sc + 
                         temptrend_abs.sc*mass.sc + 
                         temptrend_abs.sc*speed.sc + 
                         temptrend_abs.sc*consumerfrac.sc +
                         temptrend_abs.sc*nspp.sc +
                         temptrend_abs.sc*thermal_bias.sc:tsign +
                         temptrend_abs.sc*npp.sc +
                         temptrend_abs.sc*veg.sc +
                         temptrend_abs.sc*duration.sc +
                         temptrend_abs.sc*human_bowler.sc:REALM2,
                       random = randef, weights = varef, data = trends[i1,], method = 'ML',
                       control = lmeControl(maxIter = 100, msMaxIter = 100, niterEM = 50, msMaxEval = 500))
  modTsimpJturem0 <- stepAIC(modTfullJturem0ML, direction = 'backward')
  saveRDS(modTsimpJturem0, file = 'temp/modTsimpJturem0.rds')
}

if(file.exists('temp/modTsimpJbetarem0.rds')){
  modTsimpJbetarem0 <- readRDS('temp/modTsimpJbetarem0.rds')
} else {
  modTfullJbetarem0ML <- lme(Jbetatrendrem0 ~ temptrend_abs.sc*REALM + 
                         temptrend_abs.sc*tsign +
                         temptrend_abs.sc*tempave_metab.sc + 
                         temptrend_abs.sc*seas.sc + 
                         temptrend_abs.sc*microclim.sc + 
                         temptrend_abs.sc*mass.sc + 
                         temptrend_abs.sc*speed.sc + 
                         temptrend_abs.sc*consumerfrac.sc +
                         temptrend_abs.sc*nspp.sc +
                         temptrend_abs.sc*thermal_bias.sc:tsign +
                         temptrend_abs.sc*npp.sc +
                         temptrend_abs.sc*veg.sc +
                         temptrend_abs.sc*duration.sc +
                         temptrend_abs.sc*human_bowler.sc:REALM2,
                       random = randef, weights = varef, data = trends[i2,], method = 'ML')
  modTsimpJbetarem0 <- stepAIC(modTfullJbetarem0ML, direction = 'backward')
  saveRDS(modTsimpJbetarem0, file = 'temp/modTsimpJbetarem0.rds')
}

if(file.exists('temp/modTsimpHornrem0.rds')){
  modTsimpHornrem0 <- readRDS('temp/modTsimpHornrem0.rds')
} else {
  modTfullHornrem0ML <- lme(Horntrendrem0 ~ temptrend_abs.sc*REALM + 
                        temptrend_abs.sc*tsign +
                        temptrend_abs.sc*tempave_metab.sc + 
                        temptrend_abs.sc*seas.sc + 
                        temptrend_abs.sc*microclim.sc + 
                        temptrend_abs.sc*mass.sc + 
                        temptrend_abs.sc*speed.sc + 
                        temptrend_abs.sc*consumerfrac.sc +
                        temptrend_abs.sc*nspp.sc +
                        temptrend_abs.sc*thermal_bias.sc:tsign +
                        temptrend_abs.sc*npp.sc +
                        temptrend_abs.sc*veg.sc +
                        temptrend_abs.sc*duration.sc +
                        temptrend_abs.sc*human_bowler.sc:REALM2,
                      random = randef, weights = varef, data = trends[i3,], method = 'ML')
  modTsimpHornrem0 <- stepAIC(modTfullHornrem0ML, direction = 'backward')
  saveRDS(modTsimpHornrem0, file = 'temp/modTsimpHornrem0.rds')
}

summary(modTsimpJturem0)
Linear mixed-effects model fit by maximum likelihood
 Data: trends[i1, ] 

Random effects:
 Formula: ~temptrend_abs.sc | STUDY_ID
 Structure: General positive-definite, Log-Cholesky parametrization
                 StdDev      Corr  
(Intercept)      0.009359204 (Intr)
temptrend_abs.sc 0.024191157 -0.98 

 Formula: ~1 | rarefyID %in% STUDY_ID
        (Intercept) Residual
StdDev:  0.01090463 2.006731

Variance function:
 Structure: Power of variance covariate
 Formula: ~nyrBT 
 Parameter estimates:
    power 
-2.129313 
Fixed effects: Jtutrendrem0 ~ temptrend_abs.sc + tsign + tempave_metab.sc +      seas.sc + microclim.sc + mass.sc + speed.sc + consumerfrac.sc +      npp.sc + veg.sc + duration.sc + temptrend_abs.sc:tsign +      temptrend_abs.sc:tempave_metab.sc + temptrend_abs.sc:microclim.sc +      temptrend_abs.sc:consumerfrac.sc + tsign:thermal_bias.sc +      temptrend_abs.sc:npp.sc + human_bowler.sc:REALM2 + temptrend_abs.sc:tsign:thermal_bias.sc +      temptrend_abs.sc:human_bowler.sc:REALM2 
 Correlation: 
                                                 (Intr) tmpt_. tsign1 tmpv_. ses.sc mcrcl. mss.sc spd.sc cnsmr.
temptrend_abs.sc                                 -0.860                                                        
tsign1                                           -0.318  0.167                                                 
tempave_metab.sc                                 -0.095  0.079  0.081                                          
seas.sc                                           0.099 -0.049 -0.051  0.071                                   
microclim.sc                                     -0.054  0.062  0.028 -0.203  0.032                            
mass.sc                                          -0.012  0.059 -0.021  0.072  0.147  0.013                     
speed.sc                                          0.096 -0.056 -0.036 -0.113 -0.045  0.075 -0.560              
consumerfrac.sc                                   0.085 -0.084  0.000 -0.096 -0.041  0.047  0.040 -0.123       
npp.sc                                           -0.134  0.131  0.059  0.050 -0.053 -0.222 -0.045  0.130 -0.023
veg.sc                                           -0.134  0.076 -0.031 -0.074 -0.424 -0.074  0.120 -0.043  0.052
duration.sc                                      -0.174  0.145 -0.163  0.103 -0.095 -0.049 -0.010 -0.025  0.019
temptrend_abs.sc:tsign1                           0.157 -0.361 -0.516 -0.057 -0.024 -0.009 -0.009  0.017 -0.001
temptrend_abs.sc:tempave_metab.sc                 0.074 -0.076 -0.047 -0.820 -0.072  0.148  0.070 -0.182  0.112
temptrend_abs.sc:microclim.sc                     0.057 -0.056 -0.024  0.131 -0.003 -0.763  0.006 -0.048 -0.023
temptrend_abs.sc:consumerfrac.sc                 -0.089  0.092  0.011  0.072 -0.006 -0.023 -0.073  0.061 -0.783
tsign-1:thermal_bias.sc                           0.010  0.041 -0.089  0.133 -0.155 -0.005 -0.025  0.006  0.006
tsign1:thermal_bias.sc                           -0.052  0.030  0.055  0.228 -0.272 -0.089 -0.041  0.006 -0.013
temptrend_abs.sc:npp.sc                           0.125 -0.173 -0.037 -0.017 -0.008  0.191  0.032 -0.048 -0.014
human_bowler.sc:REALM2TerrFresh                  -0.029  0.031  0.021 -0.007 -0.092  0.090  0.046 -0.042 -0.031
human_bowler.sc:REALM2Marine                      0.009 -0.004 -0.014  0.092 -0.124  0.030 -0.016  0.032 -0.069
temptrend_abs.sc:tsign-1:thermal_bias.sc          0.058 -0.129 -0.059 -0.154  0.016  0.043  0.025 -0.044  0.009
temptrend_abs.sc:tsign1:thermal_bias.sc           0.010 -0.006  0.017 -0.234  0.003  0.065  0.034 -0.116  0.010
temptrend_abs.sc:human_bowler.sc:REALM2TerrFresh  0.018 -0.031 -0.010 -0.025 -0.006 -0.042  0.005 -0.016  0.023
temptrend_abs.sc:human_bowler.sc:REALM2Marine    -0.003  0.009  0.002 -0.090 -0.003 -0.016  0.031 -0.040  0.128
                                                 npp.sc veg.sc drtn.s tm_.:1 tm_.:_. tmptrnd_bs.sc:m.
temptrend_abs.sc                                                                                     
tsign1                                                                                               
tempave_metab.sc                                                                                     
seas.sc                                                                                              
microclim.sc                                                                                         
mass.sc                                                                                              
speed.sc                                                                                             
consumerfrac.sc                                                                                      
npp.sc                                                                                               
veg.sc                                           -0.064                                              
duration.sc                                       0.023 -0.034                                       
temptrend_abs.sc:tsign1                          -0.050  0.004 -0.049                                
temptrend_abs.sc:tempave_metab.sc                -0.049 -0.110 -0.013  0.046                         
temptrend_abs.sc:microclim.sc                     0.210 -0.025  0.056  0.024 -0.112                  
temptrend_abs.sc:consumerfrac.sc                  0.001 -0.014 -0.041  0.034 -0.121   0.003          
tsign-1:thermal_bias.sc                          -0.025  0.035  0.076 -0.044 -0.116   0.002          
tsign1:thermal_bias.sc                           -0.091  0.079  0.047 -0.003 -0.221   0.045          
temptrend_abs.sc:npp.sc                          -0.743 -0.004 -0.038  0.018  0.070  -0.316          
human_bowler.sc:REALM2TerrFresh                  -0.059  0.009 -0.024 -0.015 -0.009   0.005          
human_bowler.sc:REALM2Marine                     -0.231  0.062  0.019  0.006 -0.080  -0.027          
temptrend_abs.sc:tsign-1:thermal_bias.sc          0.010 -0.057 -0.048  0.241  0.178  -0.083          
temptrend_abs.sc:tsign1:thermal_bias.sc           0.083 -0.064 -0.032 -0.026  0.304  -0.179          
temptrend_abs.sc:human_bowler.sc:REALM2TerrFresh  0.017  0.003  0.014  0.024  0.031   0.036          
temptrend_abs.sc:human_bowler.sc:REALM2Marine     0.180  0.022 -0.020 -0.025  0.126  -0.020          
                                                 tmptrnd_bs.sc:c. t-1:_. ts1:_. tmptrnd_bs.sc:n. h_.:REALM2T
temptrend_abs.sc                                                                                            
tsign1                                                                                                      
tempave_metab.sc                                                                                            
seas.sc                                                                                                     
microclim.sc                                                                                                
mass.sc                                                                                                     
speed.sc                                                                                                    
consumerfrac.sc                                                                                             
npp.sc                                                                                                      
veg.sc                                                                                                      
duration.sc                                                                                                 
temptrend_abs.sc:tsign1                                                                                     
temptrend_abs.sc:tempave_metab.sc                                                                           
temptrend_abs.sc:microclim.sc                                                                               
temptrend_abs.sc:consumerfrac.sc                                                                            
tsign-1:thermal_bias.sc                          -0.002                                                     
tsign1:thermal_bias.sc                            0.021            0.323                                    
temptrend_abs.sc:npp.sc                          -0.002            0.024  0.081                             
human_bowler.sc:REALM2TerrFresh                   0.019            0.074  0.118 -0.018                      
human_bowler.sc:REALM2Marine                      0.069            0.085  0.112  0.176            0.033     
temptrend_abs.sc:tsign-1:thermal_bias.sc          0.005           -0.488 -0.281  0.006           -0.085     
temptrend_abs.sc:tsign1:thermal_bias.sc           0.003           -0.242 -0.714 -0.061           -0.091     
temptrend_abs.sc:human_bowler.sc:REALM2TerrFresh -0.020           -0.071 -0.086 -0.013           -0.630     
temptrend_abs.sc:human_bowler.sc:REALM2Marine    -0.139           -0.046 -0.080 -0.231           -0.014     
                                                 h_.:REALM2M t_.:-1 t_.:1: t_.:_.:REALM2T
temptrend_abs.sc                                                                         
tsign1                                                                                   
tempave_metab.sc                                                                         
seas.sc                                                                                  
microclim.sc                                                                             
mass.sc                                                                                  
speed.sc                                                                                 
consumerfrac.sc                                                                          
npp.sc                                                                                   
veg.sc                                                                                   
duration.sc                                                                              
temptrend_abs.sc:tsign1                                                                  
temptrend_abs.sc:tempave_metab.sc                                                        
temptrend_abs.sc:microclim.sc                                                            
temptrend_abs.sc:consumerfrac.sc                                                         
tsign-1:thermal_bias.sc                                                                  
tsign1:thermal_bias.sc                                                                   
temptrend_abs.sc:npp.sc                                                                  
human_bowler.sc:REALM2TerrFresh                                                          
human_bowler.sc:REALM2Marine                                                             
temptrend_abs.sc:tsign-1:thermal_bias.sc         -0.053                                  
temptrend_abs.sc:tsign1:thermal_bias.sc          -0.085       0.369                      
temptrend_abs.sc:human_bowler.sc:REALM2TerrFresh -0.014       0.137  0.106               
temptrend_abs.sc:human_bowler.sc:REALM2Marine    -0.771       0.044  0.085  0.011        

Standardized Within-Group Residuals:
        Min          Q1         Med          Q3         Max 
-6.63842790 -0.23658104 -0.02245775  0.26774537  5.41648169 

Number of Observations: 36017
Number of Groups: 
              STUDY_ID rarefyID %in% STUDY_ID 
                   231                  36017 
summary(modTsimpJbetarem0)
Linear mixed-effects model fit by maximum likelihood
 Data: trends[i2, ] 

Random effects:
 Formula: ~temptrend_abs.sc | STUDY_ID
 Structure: General positive-definite, Log-Cholesky parametrization
                 StdDev      Corr  
(Intercept)      0.006875615 (Intr)
temptrend_abs.sc 0.016512162 -0.015

 Formula: ~1 | rarefyID %in% STUDY_ID
        (Intercept)  Residual
StdDev:  0.00367393 0.9559692

Variance function:
 Structure: Power of variance covariate
 Formula: ~nyrBT 
 Parameter estimates:
    power 
-1.889706 
Fixed effects: Jbetatrendrem0 ~ temptrend_abs.sc + REALM + tsign + tempave_metab.sc +      microclim.sc + mass.sc + consumerfrac.sc + nspp.sc + npp.sc +      veg.sc + duration.sc + temptrend_abs.sc:REALM + temptrend_abs.sc:tsign +      temptrend_abs.sc:tempave_metab.sc + temptrend_abs.sc:microclim.sc +      temptrend_abs.sc:consumerfrac.sc + temptrend_abs.sc:nspp.sc +      tsign:thermal_bias.sc + temptrend_abs.sc:npp.sc + temptrend_abs.sc:veg.sc +      human_bowler.sc:REALM2 + temptrend_abs.sc:tsign:thermal_bias.sc +      temptrend_abs.sc:human_bowler.sc:REALM2 
 Correlation: 
                                                 (Intr) tmpt_. REALMM REALMT tsign1 tmpv_. mcrcl. mss.sc cnsmr.
temptrend_abs.sc                                 -0.565                                                        
REALMMarine                                      -0.949  0.549                                                 
REALMTerrestrial                                 -0.765  0.391  0.722                                          
tsign1                                           -0.088  0.041  0.013 -0.012                                   
tempave_metab.sc                                  0.123 -0.049 -0.106 -0.257  0.095                            
microclim.sc                                     -0.066  0.050  0.071  0.039  0.013 -0.195                     
mass.sc                                           0.168  0.015 -0.118 -0.096 -0.025  0.032  0.041              
consumerfrac.sc                                  -0.006  0.009  0.009  0.088 -0.036 -0.118  0.028 -0.001       
nspp.sc                                          -0.013 -0.021 -0.045 -0.016  0.062 -0.188 -0.145  0.026  0.129
npp.sc                                           -0.001  0.014 -0.022  0.038  0.080  0.104 -0.138  0.047 -0.039
veg.sc                                           -0.449  0.370  0.471  0.019 -0.011 -0.014 -0.013 -0.004 -0.017
duration.sc                                      -0.048  0.019  0.020 -0.026 -0.150  0.160 -0.034 -0.025  0.008
temptrend_abs.sc:REALMMarine                      0.551 -0.958 -0.566 -0.372 -0.012  0.041 -0.052  0.008 -0.009
temptrend_abs.sc:REALMTerrestrial                 0.385 -0.774 -0.366 -0.531  0.018  0.151  0.002  0.001 -0.062
temptrend_abs.sc:tsign1                           0.053 -0.126 -0.024  0.002 -0.440 -0.049 -0.010  0.017  0.007
temptrend_abs.sc:tempave_metab.sc                -0.035  0.101  0.029  0.158 -0.101 -0.521  0.030 -0.007  0.109
temptrend_abs.sc:microclim.sc                     0.048 -0.064 -0.052 -0.018 -0.017  0.124 -0.781 -0.027 -0.014
temptrend_abs.sc:consumerfrac.sc                 -0.002 -0.020 -0.001 -0.057  0.031  0.090  0.005 -0.035 -0.715
temptrend_abs.sc:nspp.sc                         -0.007  0.009  0.026  0.020 -0.031  0.112  0.073 -0.020 -0.070
tsign-1:thermal_bias.sc                           0.033 -0.005 -0.020 -0.066 -0.088  0.157  0.011  0.000  0.000
tsign1:thermal_bias.sc                            0.067 -0.023 -0.052 -0.144  0.041  0.318 -0.089  0.063 -0.049
temptrend_abs.sc:npp.sc                           0.014  0.023  0.005 -0.044 -0.050 -0.043  0.148 -0.006  0.009
temptrend_abs.sc:veg.sc                           0.358 -0.449 -0.374  0.005 -0.008 -0.005  0.006  0.003  0.009
human_bowler.sc:REALM2TerrFresh                  -0.107  0.124  0.114 -0.027  0.016  0.003  0.116  0.011 -0.039
human_bowler.sc:REALM2Marine                      0.023 -0.010 -0.013 -0.055 -0.019  0.134  0.051  0.035 -0.087
temptrend_abs.sc:tsign-1:thermal_bias.sc         -0.013  0.012  0.012  0.071 -0.069 -0.103  0.002 -0.016  0.013
temptrend_abs.sc:tsign1:thermal_bias.sc          -0.021  0.053  0.013  0.099 -0.006 -0.161  0.018 -0.045  0.025
temptrend_abs.sc:human_bowler.sc:REALM2TerrFresh  0.145 -0.206 -0.155  0.024 -0.015 -0.017 -0.068 -0.010  0.025
temptrend_abs.sc:human_bowler.sc:REALM2Marine    -0.015  0.016  0.009  0.048  0.006 -0.101 -0.024 -0.016  0.134
                                                 nspp.s npp.sc veg.sc drtn.s t_.:REALMM t_.:REALMT tm_.:1 tm_.:_.
temptrend_abs.sc                                                                                                 
REALMMarine                                                                                                      
REALMTerrestrial                                                                                                 
tsign1                                                                                                           
tempave_metab.sc                                                                                                 
microclim.sc                                                                                                     
mass.sc                                                                                                          
consumerfrac.sc                                                                                                  
nspp.sc                                                                                                          
npp.sc                                           -0.245                                                          
veg.sc                                            0.029 -0.197                                                   
duration.sc                                      -0.141  0.074 -0.011                                            
temptrend_abs.sc:REALMMarine                      0.043  0.020 -0.389  0.019                                     
temptrend_abs.sc:REALMTerrestrial                 0.034 -0.053  0.008  0.025  0.730                              
temptrend_abs.sc:tsign1                          -0.003 -0.068 -0.025 -0.037  0.047      0.004                   
temptrend_abs.sc:tempave_metab.sc                 0.081 -0.046  0.000 -0.051 -0.072     -0.281      0.044        
temptrend_abs.sc:microclim.sc                     0.084  0.162  0.003  0.028  0.070     -0.029      0.015  0.028 
temptrend_abs.sc:consumerfrac.sc                 -0.100  0.017  0.003 -0.008  0.021      0.086      0.015 -0.152 
temptrend_abs.sc:nspp.sc                         -0.592  0.133 -0.031 -0.010 -0.058     -0.050     -0.016 -0.083 
tsign-1:thermal_bias.sc                          -0.053 -0.019  0.005  0.077  0.011      0.048     -0.053 -0.072 
tsign1:thermal_bias.sc                           -0.085 -0.088  0.030  0.075  0.014      0.107      0.005 -0.198 
temptrend_abs.sc:npp.sc                           0.144 -0.737  0.153 -0.069 -0.063      0.061      0.029  0.076 
temptrend_abs.sc:veg.sc                          -0.035  0.174 -0.815  0.021  0.474     -0.006      0.051 -0.023 
human_bowler.sc:REALM2TerrFresh                   0.005 -0.130  0.256 -0.029 -0.134      0.023     -0.024 -0.008 
human_bowler.sc:REALM2Marine                     -0.045 -0.235  0.049  0.024  0.005      0.042      0.008 -0.087 
temptrend_abs.sc:tsign-1:thermal_bias.sc          0.003  0.012 -0.005 -0.064 -0.026     -0.112      0.274  0.225 
temptrend_abs.sc:tsign1:thermal_bias.sc           0.037  0.090 -0.047 -0.058 -0.031     -0.166     -0.018  0.374 
temptrend_abs.sc:human_bowler.sc:REALM2TerrFresh  0.006  0.100 -0.354  0.025  0.220     -0.026      0.044  0.037 
temptrend_abs.sc:human_bowler.sc:REALM2Marine     0.037  0.181 -0.040 -0.014 -0.008     -0.054     -0.015  0.126 
                                                 tmptrnd_bs.sc:m. tmptrnd_bs.sc:c. tmptrnd_bs.sc:ns. t-1:_.
temptrend_abs.sc                                                                                           
REALMMarine                                                                                                
REALMTerrestrial                                                                                           
tsign1                                                                                                     
tempave_metab.sc                                                                                           
microclim.sc                                                                                               
mass.sc                                                                                                    
consumerfrac.sc                                                                                            
nspp.sc                                                                                                    
npp.sc                                                                                                     
veg.sc                                                                                                     
duration.sc                                                                                                
temptrend_abs.sc:REALMMarine                                                                               
temptrend_abs.sc:REALMTerrestrial                                                                          
temptrend_abs.sc:tsign1                                                                                    
temptrend_abs.sc:tempave_metab.sc                                                                          
temptrend_abs.sc:microclim.sc                                                                              
temptrend_abs.sc:consumerfrac.sc                 -0.021                                                    
temptrend_abs.sc:nspp.sc                         -0.048            0.133                                   
tsign-1:thermal_bias.sc                          -0.009           -0.002            0.013                  
tsign1:thermal_bias.sc                            0.037            0.031            0.004             0.258
temptrend_abs.sc:npp.sc                          -0.283           -0.025           -0.143             0.018
temptrend_abs.sc:veg.sc                           0.035           -0.004            0.018            -0.006
human_bowler.sc:REALM2TerrFresh                  -0.031            0.022            0.025             0.054
human_bowler.sc:REALM2Marine                     -0.040            0.084            0.056             0.072
temptrend_abs.sc:tsign-1:thermal_bias.sc         -0.029           -0.010            0.014            -0.414
temptrend_abs.sc:tsign1:thermal_bias.sc          -0.096           -0.027           -0.033            -0.186
temptrend_abs.sc:human_bowler.sc:REALM2TerrFresh  0.091           -0.026           -0.019            -0.054
temptrend_abs.sc:human_bowler.sc:REALM2Marine    -0.020           -0.137           -0.063            -0.048
                                                 ts1:_. tmptrnd_bs.sc:np. tmptrnd_bs.sc:v. h_.:REALM2T
temptrend_abs.sc                                                                                      
REALMMarine                                                                                           
REALMTerrestrial                                                                                      
tsign1                                                                                                
tempave_metab.sc                                                                                      
microclim.sc                                                                                          
mass.sc                                                                                               
consumerfrac.sc                                                                                       
nspp.sc                                                                                               
npp.sc                                                                                                
veg.sc                                                                                                
duration.sc                                                                                           
temptrend_abs.sc:REALMMarine                                                                          
temptrend_abs.sc:REALMTerrestrial                                                                     
temptrend_abs.sc:tsign1                                                                               
temptrend_abs.sc:tempave_metab.sc                                                                     
temptrend_abs.sc:microclim.sc                                                                         
temptrend_abs.sc:consumerfrac.sc                                                                      
temptrend_abs.sc:nspp.sc                                                                              
tsign-1:thermal_bias.sc                                                                               
tsign1:thermal_bias.sc                                                                                
temptrend_abs.sc:npp.sc                           0.094                                               
temptrend_abs.sc:veg.sc                          -0.055 -0.264                                        
human_bowler.sc:REALM2TerrFresh                   0.129  0.059            -0.302                      
human_bowler.sc:REALM2Marine                      0.069  0.177            -0.044            0.045     
temptrend_abs.sc:tsign-1:thermal_bias.sc         -0.258 -0.009            -0.001           -0.092     
temptrend_abs.sc:tsign1:thermal_bias.sc          -0.712 -0.085             0.049           -0.104     
temptrend_abs.sc:human_bowler.sc:REALM2TerrFresh -0.109 -0.143             0.463           -0.752     
temptrend_abs.sc:human_bowler.sc:REALM2Marine    -0.066 -0.214             0.059           -0.040     
                                                 h_.:REALM2M t_.:-1 t_.:1: t_.:_.:REALM2T
temptrend_abs.sc                                                                         
REALMMarine                                                                              
REALMTerrestrial                                                                         
tsign1                                                                                   
tempave_metab.sc                                                                         
microclim.sc                                                                             
mass.sc                                                                                  
consumerfrac.sc                                                                          
nspp.sc                                                                                  
npp.sc                                                                                   
veg.sc                                                                                   
duration.sc                                                                              
temptrend_abs.sc:REALMMarine                                                             
temptrend_abs.sc:REALMTerrestrial                                                        
temptrend_abs.sc:tsign1                                                                  
temptrend_abs.sc:tempave_metab.sc                                                        
temptrend_abs.sc:microclim.sc                                                            
temptrend_abs.sc:consumerfrac.sc                                                         
temptrend_abs.sc:nspp.sc                                                                 
tsign-1:thermal_bias.sc                                                                  
tsign1:thermal_bias.sc                                                                   
temptrend_abs.sc:npp.sc                                                                  
temptrend_abs.sc:veg.sc                                                                  
human_bowler.sc:REALM2TerrFresh                                                          
human_bowler.sc:REALM2Marine                                                             
temptrend_abs.sc:tsign-1:thermal_bias.sc         -0.044                                  
temptrend_abs.sc:tsign1:thermal_bias.sc          -0.070       0.384                      
temptrend_abs.sc:human_bowler.sc:REALM2TerrFresh -0.036       0.124  0.123               
temptrend_abs.sc:human_bowler.sc:REALM2Marine    -0.759       0.041  0.074  0.037        

Standardized Within-Group Residuals:
        Min          Q1         Med          Q3         Max 
-8.39440359 -0.32029428 -0.03087913  0.31695654  8.33262939 

Number of Observations: 36017
Number of Groups: 
              STUDY_ID rarefyID %in% STUDY_ID 
                   231                  36017 
summary(modTsimpHornrem0)
Linear mixed-effects model fit by maximum likelihood
 Data: trends[i3, ] 

Random effects:
 Formula: ~temptrend_abs.sc | STUDY_ID
 Structure: General positive-definite, Log-Cholesky parametrization
                 StdDev     Corr  
(Intercept)      0.01429668 (Intr)
temptrend_abs.sc 0.02508293 0.046 

 Formula: ~1 | rarefyID %in% STUDY_ID
        (Intercept) Residual
StdDev:  0.01877495  2.44238

Variance function:
 Structure: Power of variance covariate
 Formula: ~nyrBT 
 Parameter estimates:
    power 
-2.326836 
Fixed effects: Horntrendrem0 ~ temptrend_abs.sc + REALM + tsign + tempave_metab.sc +      seas.sc + mass.sc + speed.sc + consumerfrac.sc + nspp.sc +      npp.sc + veg.sc + duration.sc + temptrend_abs.sc:REALM +      temptrend_abs.sc:tsign + temptrend_abs.sc:consumerfrac.sc +      tsign:thermal_bias.sc + temptrend_abs.sc:npp.sc + temptrend_abs.sc:veg.sc +      human_bowler.sc:REALM2 + temptrend_abs.sc:tsign:thermal_bias.sc +      temptrend_abs.sc:human_bowler.sc:REALM2 
 Correlation: 
                                                 (Intr) tmpt_. REALMM REALMT tsign1 tmpv_. ses.sc mss.sc spd.sc
temptrend_abs.sc                                 -0.472                                                        
REALMMarine                                      -0.957  0.456                                                 
REALMTerrestrial                                 -0.747  0.335  0.698                                          
tsign1                                           -0.069  0.049  0.003  0.012                                   
tempave_metab.sc                                  0.100 -0.003 -0.081 -0.205  0.009                            
seas.sc                                          -0.085 -0.012  0.130 -0.038 -0.076  0.083                     
mass.sc                                           0.078  0.006 -0.054 -0.043  0.002  0.081  0.078              
speed.sc                                          0.073  0.004 -0.027 -0.054 -0.057 -0.058  0.024 -0.428       
consumerfrac.sc                                  -0.013  0.009  0.009  0.072  0.031 -0.087 -0.058  0.004 -0.063
nspp.sc                                          -0.011 -0.025 -0.031 -0.030  0.054 -0.155  0.037 -0.065  0.132
npp.sc                                            0.000  0.037 -0.013  0.067  0.014 -0.041 -0.137 -0.046  0.136
veg.sc                                           -0.539  0.287  0.557  0.044 -0.007 -0.003  0.035  0.006 -0.016
duration.sc                                      -0.027  0.038  0.016  0.010 -0.157  0.127 -0.080  0.002 -0.005
temptrend_abs.sc:REALMMarine                      0.460 -0.958 -0.466 -0.319 -0.023  0.014  0.019  0.008  0.004
temptrend_abs.sc:REALMTerrestrial                 0.319 -0.781 -0.301 -0.438 -0.009  0.020 -0.017 -0.009  0.010
temptrend_abs.sc:tsign1                           0.043 -0.116 -0.014  0.000 -0.488 -0.021 -0.015  0.005  0.022
temptrend_abs.sc:consumerfrac.sc                  0.008 -0.018 -0.012 -0.034 -0.011  0.028  0.003 -0.027  0.019
tsign-1:thermal_bias.sc                           0.049 -0.002 -0.044 -0.067 -0.099  0.201 -0.173 -0.037 -0.004
tsign1:thermal_bias.sc                            0.083 -0.006 -0.086 -0.114  0.060  0.324 -0.303  0.000 -0.031
temptrend_abs.sc:npp.sc                           0.033 -0.026 -0.028 -0.057 -0.004  0.060 -0.044  0.024 -0.065
temptrend_abs.sc:veg.sc                           0.317 -0.445 -0.326  0.003 -0.022 -0.013  0.009 -0.003  0.010
human_bowler.sc:REALM2TerrFresh                  -0.056  0.056  0.057 -0.026  0.018  0.034 -0.048  0.031 -0.033
human_bowler.sc:REALM2Marine                      0.032 -0.007 -0.036 -0.037 -0.015  0.092 -0.127 -0.010  0.017
temptrend_abs.sc:tsign-1:thermal_bias.sc         -0.007 -0.013  0.008  0.036 -0.038  0.016  0.042  0.007 -0.007
temptrend_abs.sc:tsign1:thermal_bias.sc          -0.017  0.009  0.015  0.042  0.023  0.040  0.075  0.003 -0.022
temptrend_abs.sc:human_bowler.sc:REALM2TerrFresh  0.116 -0.209 -0.121  0.017 -0.016 -0.005  0.027 -0.009  0.003
temptrend_abs.sc:human_bowler.sc:REALM2Marine    -0.019  0.009  0.024  0.029  0.007 -0.039  0.047  0.011 -0.016
                                                 cnsmr. nspp.s npp.sc veg.sc drtn.s t_.:REALMM t_.:REALMT tm_.:1
temptrend_abs.sc                                                                                                
REALMMarine                                                                                                     
REALMTerrestrial                                                                                                
tsign1                                                                                                          
tempave_metab.sc                                                                                                
seas.sc                                                                                                         
mass.sc                                                                                                         
speed.sc                                                                                                        
consumerfrac.sc                                                                                                 
nspp.sc                                           0.089                                                         
npp.sc                                           -0.018 -0.203                                                  
veg.sc                                            0.002  0.011 -0.159                                           
duration.sc                                       0.016 -0.201  0.039 -0.005                                    
temptrend_abs.sc:REALMMarine                     -0.017  0.016 -0.006 -0.301 -0.001                             
temptrend_abs.sc:REALMTerrestrial                -0.025  0.025 -0.054  0.008 -0.004  0.738                      
temptrend_abs.sc:tsign1                          -0.013 -0.016 -0.038 -0.011 -0.007  0.043      0.012           
temptrend_abs.sc:consumerfrac.sc                 -0.712 -0.017 -0.010 -0.009 -0.008  0.029      0.040      0.038
tsign-1:thermal_bias.sc                          -0.003 -0.047 -0.017  0.007  0.071  0.006      0.040     -0.025
tsign1:thermal_bias.sc                           -0.008 -0.073 -0.113  0.008  0.056  0.001      0.057      0.010
temptrend_abs.sc:npp.sc                          -0.017  0.064 -0.650  0.098 -0.017 -0.015      0.076      0.001
temptrend_abs.sc:veg.sc                          -0.003 -0.016  0.148 -0.616  0.006  0.467     -0.024      0.061
human_bowler.sc:REALM2TerrFresh                  -0.029  0.018 -0.082  0.138 -0.009 -0.062      0.035     -0.013
human_bowler.sc:REALM2Marine                     -0.054 -0.025 -0.230  0.036  0.034  0.013      0.025      0.013
temptrend_abs.sc:tsign-1:thermal_bias.sc         -0.014  0.000  0.009 -0.009 -0.033 -0.003     -0.060      0.262
temptrend_abs.sc:tsign1:thermal_bias.sc          -0.028 -0.012  0.100 -0.027 -0.028  0.002     -0.078     -0.029
temptrend_abs.sc:human_bowler.sc:REALM2TerrFresh  0.004 -0.009  0.071 -0.262  0.017  0.220     -0.031      0.049
temptrend_abs.sc:human_bowler.sc:REALM2Marine     0.127  0.002  0.174 -0.024 -0.014 -0.015     -0.028     -0.009
                                                 tmptrnd_bs.sc:c. t-1:_. ts1:_. tmptrnd_bs.sc:n. tmptrnd_bs.sc:v.
temptrend_abs.sc                                                                                                 
REALMMarine                                                                                                      
REALMTerrestrial                                                                                                 
tsign1                                                                                                           
tempave_metab.sc                                                                                                 
seas.sc                                                                                                          
mass.sc                                                                                                          
speed.sc                                                                                                         
consumerfrac.sc                                                                                                  
nspp.sc                                                                                                          
npp.sc                                                                                                           
veg.sc                                                                                                           
duration.sc                                                                                                      
temptrend_abs.sc:REALMMarine                                                                                     
temptrend_abs.sc:REALMTerrestrial                                                                                
temptrend_abs.sc:tsign1                                                                                          
temptrend_abs.sc:consumerfrac.sc                                                                                 
tsign-1:thermal_bias.sc                           0.003                                                          
tsign1:thermal_bias.sc                            0.013            0.370                                         
temptrend_abs.sc:npp.sc                           0.014            0.018  0.095                                  
temptrend_abs.sc:veg.sc                           0.007           -0.007 -0.039 -0.231                           
human_bowler.sc:REALM2TerrFresh                   0.011            0.057  0.115  0.043           -0.194          
human_bowler.sc:REALM2Marine                      0.068            0.113  0.140  0.174           -0.041          
temptrend_abs.sc:tsign-1:thermal_bias.sc          0.026           -0.452 -0.220 -0.033            0.018          
temptrend_abs.sc:tsign1:thermal_bias.sc           0.034           -0.210 -0.614 -0.159            0.067          
temptrend_abs.sc:human_bowler.sc:REALM2TerrFresh  0.002           -0.063 -0.091 -0.112            0.492          
temptrend_abs.sc:human_bowler.sc:REALM2Marine    -0.147           -0.062 -0.094 -0.265            0.060          
                                                 h_.:REALM2T h_.:REALM2M t_.:-1 t_.:1: t_.:_.:REALM2T
temptrend_abs.sc                                                                                     
REALMMarine                                                                                          
REALMTerrestrial                                                                                     
tsign1                                                                                               
tempave_metab.sc                                                                                     
seas.sc                                                                                              
mass.sc                                                                                              
speed.sc                                                                                             
consumerfrac.sc                                                                                      
nspp.sc                                                                                              
npp.sc                                                                                               
veg.sc                                                                                               
duration.sc                                                                                          
temptrend_abs.sc:REALMMarine                                                                         
temptrend_abs.sc:REALMTerrestrial                                                                    
temptrend_abs.sc:tsign1                                                                              
temptrend_abs.sc:consumerfrac.sc                                                                     
tsign-1:thermal_bias.sc                                                                              
tsign1:thermal_bias.sc                                                                               
temptrend_abs.sc:npp.sc                                                                              
temptrend_abs.sc:veg.sc                                                                              
human_bowler.sc:REALM2TerrFresh                                                                      
human_bowler.sc:REALM2Marine                      0.035                                              
temptrend_abs.sc:tsign-1:thermal_bias.sc         -0.057      -0.046                                  
temptrend_abs.sc:tsign1:thermal_bias.sc          -0.062      -0.085       0.361                      
temptrend_abs.sc:human_bowler.sc:REALM2TerrFresh -0.537      -0.031       0.142  0.132               
temptrend_abs.sc:human_bowler.sc:REALM2Marine    -0.021      -0.728       0.021  0.052  0.033        

Standardized Within-Group Residuals:
        Min          Q1         Med          Q3         Max 
-5.66375573 -0.23464298 -0.02584232  0.23186565  5.76940752 

Number of Observations: 35327
Number of Groups: 
              STUDY_ID rarefyID %in% STUDY_ID 
                   200                  35327 

Make realm-specific models

summary(modTfullHornTerr)
Linear mixed-effects model fit by REML
 Data: trends[i1, ] 

Random effects:
 Formula: ~temptrend_abs.sc | STUDY_ID
 Structure: General positive-definite, Log-Cholesky parametrization
                 StdDev      Corr  
(Intercept)      0.009555472 (Intr)
temptrend_abs.sc 0.022365121 0.313 

 Formula: ~1 | rarefyID %in% STUDY_ID
        (Intercept) Residual
StdDev: 0.004029061 1.695873

Variance function:
 Structure: Power of variance covariate
 Formula: ~nyrBT 
 Parameter estimates:
    power 
-2.036154 
Fixed effects: Horntrendrem0 ~ temptrend_abs.sc * tsign + temptrend_abs.sc *      tempave_metab.sc + temptrend_abs.sc * seas.sc + temptrend_abs.sc *      microclim.sc + temptrend_abs.sc * mass.sc + temptrend_abs.sc *      speed.sc + temptrend_abs.sc * consumerfrac.sc + temptrend_abs.sc *      nspp.sc + temptrend_abs.sc * thermal_bias.sc:tsign + temptrend_abs.sc *      npp.sc + temptrend_abs.sc * veg.sc + temptrend_abs.sc * duration.sc +      temptrend_abs.sc * human_bowler.sc 
 Correlation: 
                                         (Intr) tmpt_. tsign1 tmpv_. ses.sc mcrcl. mss.sc spd.sc cnsmr.
temptrend_abs.sc                         -0.629                                                        
tsign1                                   -0.215  0.019                                                 
tempave_metab.sc                         -0.486  0.307 -0.209                                          
seas.sc                                  -0.258  0.267 -0.078  0.049                                   
microclim.sc                             -0.182  0.232  0.094 -0.018  0.473                            
mass.sc                                   0.515 -0.246 -0.010 -0.141  0.008  0.039                     
speed.sc                                  0.102  0.048 -0.033 -0.595 -0.025 -0.031 -0.141              
consumerfrac.sc                           0.356 -0.340  0.181  0.004 -0.048  0.072  0.424 -0.654       
nspp.sc                                  -0.064  0.025 -0.016 -0.061 -0.118 -0.161 -0.012  0.032  0.000
npp.sc                                   -0.044  0.007  0.118 -0.045  0.204  0.149  0.011  0.013 -0.007
veg.sc                                   -0.213  0.262 -0.078 -0.082 -0.069 -0.106  0.001  0.198 -0.160
duration.sc                              -0.098  0.042 -0.186  0.067  0.069 -0.016 -0.013 -0.051  0.138
human_bowler.sc                          -0.229  0.250  0.042  0.057 -0.059  0.150 -0.120  0.007 -0.147
temptrend_abs.sc:tsign1                   0.169 -0.306 -0.490  0.093 -0.109 -0.195  0.015  0.050 -0.111
temptrend_abs.sc:tempave_metab.sc         0.296 -0.503  0.138 -0.662 -0.039 -0.003  0.002  0.427 -0.032
temptrend_abs.sc:seas.sc                  0.219 -0.380  0.028 -0.025 -0.748 -0.378 -0.012  0.008  0.045
temptrend_abs.sc:microclim.sc             0.174 -0.290 -0.097  0.007 -0.367 -0.845 -0.034  0.038 -0.071
temptrend_abs.sc:mass.sc                 -0.313  0.361  0.005 -0.015 -0.041 -0.038 -0.642  0.280 -0.433
temptrend_abs.sc:speed.sc                 0.039  0.012  0.007  0.427  0.048  0.058  0.213 -0.732  0.560
temptrend_abs.sc:consumerfrac.sc         -0.283  0.407 -0.096 -0.047 -0.009 -0.066 -0.336  0.552 -0.784
temptrend_abs.sc:nspp.sc                  0.025 -0.086  0.006  0.050  0.053  0.060 -0.005  0.003 -0.014
tsign-1:thermal_bias.sc                  -0.091 -0.062  0.667 -0.179 -0.286 -0.090  0.013 -0.024  0.140
tsign1:thermal_bias.sc                    0.212 -0.208 -0.065 -0.033 -0.666 -0.403  0.049  0.039 -0.026
temptrend_abs.sc:npp.sc                   0.027  0.023 -0.116  0.050 -0.131 -0.072 -0.023 -0.018  0.004
temptrend_abs.sc:veg.sc                   0.225 -0.308  0.055  0.044  0.027  0.048  0.031 -0.133  0.116
temptrend_abs.sc:duration.sc             -0.064  0.147  0.020 -0.086 -0.033  0.033  0.001  0.020 -0.059
temptrend_abs.sc:human_bowler.sc          0.242 -0.331 -0.037 -0.055 -0.037 -0.159  0.096  0.004  0.106
temptrend_abs.sc:tsign-1:thermal_bias.sc  0.049 -0.049 -0.379  0.107  0.218  0.025 -0.004  0.036 -0.095
temptrend_abs.sc:tsign1:thermal_bias.sc  -0.140  0.284  0.118 -0.001  0.450  0.297 -0.010 -0.009  0.032
                                         nspp.s npp.sc veg.sc drtn.s hmn_b. tm_.:1 tmptrnd_bs.sc:t_.
temptrend_abs.sc                                                                                    
tsign1                                                                                              
tempave_metab.sc                                                                                    
seas.sc                                                                                             
microclim.sc                                                                                        
mass.sc                                                                                             
speed.sc                                                                                            
consumerfrac.sc                                                                                     
nspp.sc                                                                                             
npp.sc                                   -0.064                                                     
veg.sc                                   -0.038 -0.553                                              
duration.sc                              -0.012 -0.020 -0.022                                       
human_bowler.sc                           0.019 -0.190  0.287 -0.127                                
temptrend_abs.sc:tsign1                  -0.013 -0.123  0.012  0.122 -0.120                         
temptrend_abs.sc:tempave_metab.sc         0.065  0.034  0.059 -0.090 -0.025 -0.077                  
temptrend_abs.sc:seas.sc                  0.073 -0.106  0.012 -0.028 -0.077  0.146  0.033           
temptrend_abs.sc:microclim.sc             0.090 -0.089  0.054  0.026 -0.139  0.232  0.001           
temptrend_abs.sc:mass.sc                  0.018 -0.026  0.020  0.031  0.088  0.053  0.063           
temptrend_abs.sc:speed.sc                -0.016 -0.007 -0.133  0.034  0.004 -0.073 -0.598           
temptrend_abs.sc:consumerfrac.sc          0.017  0.007  0.087 -0.118  0.068  0.101  0.017           
temptrend_abs.sc:nspp.sc                 -0.603  0.011  0.028 -0.007  0.055  0.019 -0.015           
tsign-1:thermal_bias.sc                   0.004  0.115 -0.079 -0.062  0.055 -0.214  0.119           
tsign1:thermal_bias.sc                   -0.028  0.143 -0.091 -0.017  0.084  0.301  0.012           
temptrend_abs.sc:npp.sc                   0.003 -0.880  0.494  0.021  0.147  0.149 -0.046           
temptrend_abs.sc:veg.sc                   0.013  0.504 -0.847  0.026 -0.301 -0.005 -0.071           
temptrend_abs.sc:duration.sc              0.152  0.001  0.010 -0.250  0.105 -0.223  0.094           
temptrend_abs.sc:human_bowler.sc          0.032  0.135 -0.334  0.116 -0.798  0.151  0.051           
temptrend_abs.sc:tsign-1:thermal_bias.sc -0.015 -0.268  0.129  0.041 -0.116  0.635 -0.107           
temptrend_abs.sc:tsign1:thermal_bias.sc   0.026 -0.186  0.122 -0.028 -0.006 -0.369 -0.014           
                                         tmptrnd_bs.sc:ss. tmptrnd_bs.sc:mc. tmptrnd_bs.sc:ms.
temptrend_abs.sc                                                                              
tsign1                                                                                        
tempave_metab.sc                                                                              
seas.sc                                                                                       
microclim.sc                                                                                  
mass.sc                                                                                       
speed.sc                                                                                      
consumerfrac.sc                                                                               
nspp.sc                                                                                       
npp.sc                                                                                        
veg.sc                                                                                        
duration.sc                                                                                   
human_bowler.sc                                                                               
temptrend_abs.sc:tsign1                                                                       
temptrend_abs.sc:tempave_metab.sc                                                             
temptrend_abs.sc:seas.sc                                                                      
temptrend_abs.sc:microclim.sc             0.453                                               
temptrend_abs.sc:mass.sc                  0.028             0.039                             
temptrend_abs.sc:speed.sc                -0.029            -0.063            -0.439           
temptrend_abs.sc:consumerfrac.sc         -0.017             0.081             0.549           
temptrend_abs.sc:nspp.sc                 -0.055            -0.058             0.002           
tsign-1:thermal_bias.sc                   0.198             0.050             0.011           
tsign1:thermal_bias.sc                    0.496             0.298             0.021           
temptrend_abs.sc:npp.sc                   0.078             0.074             0.011           
temptrend_abs.sc:veg.sc                   0.016            -0.034            -0.028           
temptrend_abs.sc:duration.sc              0.012            -0.038            -0.011           
temptrend_abs.sc:human_bowler.sc          0.066             0.201            -0.080           
temptrend_abs.sc:tsign-1:thermal_bias.sc -0.305            -0.022             0.054           
temptrend_abs.sc:tsign1:thermal_bias.sc  -0.615            -0.339            -0.018           
                                         tmptrnd_bs.sc:sp. tmptrnd_bs.sc:c. tmptrnd_bs.sc:ns. t-1:_.
temptrend_abs.sc                                                                                    
tsign1                                                                                              
tempave_metab.sc                                                                                    
seas.sc                                                                                             
microclim.sc                                                                                        
mass.sc                                                                                             
speed.sc                                                                                            
consumerfrac.sc                                                                                     
nspp.sc                                                                                             
npp.sc                                                                                              
veg.sc                                                                                              
duration.sc                                                                                         
human_bowler.sc                                                                                     
temptrend_abs.sc:tsign1                                                                             
temptrend_abs.sc:tempave_metab.sc                                                                   
temptrend_abs.sc:seas.sc                                                                            
temptrend_abs.sc:microclim.sc                                                                       
temptrend_abs.sc:mass.sc                                                                            
temptrend_abs.sc:speed.sc                                                                           
temptrend_abs.sc:consumerfrac.sc         -0.699                                                     
temptrend_abs.sc:nspp.sc                 -0.032             0.012                                   
tsign-1:thermal_bias.sc                  -0.014            -0.061            0.022                  
tsign1:thermal_bias.sc                   -0.027             0.039            0.049             0.281
temptrend_abs.sc:npp.sc                   0.033            -0.034           -0.024            -0.123
temptrend_abs.sc:veg.sc                   0.147            -0.097           -0.050             0.076
temptrend_abs.sc:duration.sc             -0.015             0.043           -0.259             0.026
temptrend_abs.sc:human_bowler.sc         -0.030            -0.066           -0.053            -0.040
temptrend_abs.sc:tsign-1:thermal_bias.sc -0.045             0.083           -0.009            -0.457
temptrend_abs.sc:tsign1:thermal_bias.sc   0.016            -0.024           -0.077            -0.196
                                         ts1:_. tmptrnd_bs.sc:np. tmptrnd_bs.sc:v. tmptrnd_bs.sc:d.
temptrend_abs.sc                                                                                   
tsign1                                                                                             
tempave_metab.sc                                                                                   
seas.sc                                                                                            
microclim.sc                                                                                       
mass.sc                                                                                            
speed.sc                                                                                           
consumerfrac.sc                                                                                    
nspp.sc                                                                                            
npp.sc                                                                                             
veg.sc                                                                                             
duration.sc                                                                                        
human_bowler.sc                                                                                    
temptrend_abs.sc:tsign1                                                                            
temptrend_abs.sc:tempave_metab.sc                                                                  
temptrend_abs.sc:seas.sc                                                                           
temptrend_abs.sc:microclim.sc                                                                      
temptrend_abs.sc:mass.sc                                                                           
temptrend_abs.sc:speed.sc                                                                          
temptrend_abs.sc:consumerfrac.sc                                                                   
temptrend_abs.sc:nspp.sc                                                                           
tsign-1:thermal_bias.sc                                                                            
tsign1:thermal_bias.sc                                                                             
temptrend_abs.sc:npp.sc                  -0.152                                                    
temptrend_abs.sc:veg.sc                   0.111 -0.609                                             
temptrend_abs.sc:duration.sc             -0.064 -0.005             0.004                           
temptrend_abs.sc:human_bowler.sc         -0.044 -0.180             0.418           -0.105          
temptrend_abs.sc:tsign-1:thermal_bias.sc -0.267  0.311            -0.156           -0.092          
temptrend_abs.sc:tsign1:thermal_bias.sc  -0.831  0.198            -0.155            0.085          
                                         tmptrnd_bs.sc:h_. t_.:-1
temptrend_abs.sc                                                 
tsign1                                                           
tempave_metab.sc                                                 
seas.sc                                                          
microclim.sc                                                     
mass.sc                                                          
speed.sc                                                         
consumerfrac.sc                                                  
nspp.sc                                                          
npp.sc                                                           
veg.sc                                                           
duration.sc                                                      
human_bowler.sc                                                  
temptrend_abs.sc:tsign1                                          
temptrend_abs.sc:tempave_metab.sc                                
temptrend_abs.sc:seas.sc                                         
temptrend_abs.sc:microclim.sc                                    
temptrend_abs.sc:mass.sc                                         
temptrend_abs.sc:speed.sc                                        
temptrend_abs.sc:consumerfrac.sc                                 
temptrend_abs.sc:nspp.sc                                         
tsign-1:thermal_bias.sc                                          
tsign1:thermal_bias.sc                                           
temptrend_abs.sc:npp.sc                                          
temptrend_abs.sc:veg.sc                                          
temptrend_abs.sc:duration.sc                                     
temptrend_abs.sc:human_bowler.sc                                 
temptrend_abs.sc:tsign-1:thermal_bias.sc  0.169                  
temptrend_abs.sc:tsign1:thermal_bias.sc   0.038             0.319

Standardized Within-Group Residuals:
        Min          Q1         Med          Q3         Max 
-5.32506581 -0.38770014 -0.04491269  0.36618931  5.19217938 

Number of Observations: 2299
Number of Groups: 
              STUDY_ID rarefyID %in% STUDY_ID 
                    90                   2299 
summary(modTfullHornFresh)
Linear mixed-effects model fit by REML
 Data: trends[i2, ] 

Random effects:
 Formula: ~temptrend_abs.sc | STUDY_ID
 Structure: General positive-definite, Log-Cholesky parametrization
                 StdDev       Corr  
(Intercept)      3.088553e-08 (Intr)
temptrend_abs.sc 2.055026e-02 0.025 

 Formula: ~1 | rarefyID %in% STUDY_ID
        (Intercept) Residual
StdDev:  0.02085277  2.44783

Variance function:
 Structure: Power of variance covariate
 Formula: ~nyrBT 
 Parameter estimates:
    power 
-2.345198 
Fixed effects: Horntrendrem0 ~ temptrend_abs.sc * tsign + temptrend_abs.sc *      tempave_metab.sc + temptrend_abs.sc * seas.sc + temptrend_abs.sc *      microclim.sc + temptrend_abs.sc * mass.sc + temptrend_abs.sc *      speed.sc + temptrend_abs.sc * nspp.sc + temptrend_abs.sc *      thermal_bias.sc:tsign + temptrend_abs.sc * npp.sc + temptrend_abs.sc *      veg.sc + temptrend_abs.sc * duration.sc + temptrend_abs.sc *      human_bowler.sc 
 Correlation: 
                                         (Intr) tmpt_. tsign1 tmpv_. ses.sc mcrcl. mss.sc spd.sc nspp.s
temptrend_abs.sc                         -0.602                                                        
tsign1                                   -0.231  0.096                                                 
tempave_metab.sc                          0.484 -0.185  0.121                                          
seas.sc                                   0.008 -0.055  0.022  0.354                                   
microclim.sc                             -0.132  0.056  0.107  0.381  0.099                            
mass.sc                                  -0.034  0.042 -0.073 -0.301  0.196 -0.393                     
speed.sc                                  0.241 -0.155  0.004  0.232  0.111  0.078 -0.670              
nspp.sc                                   0.125 -0.007 -0.163 -0.343 -0.442 -0.166  0.205 -0.078       
npp.sc                                   -0.272 -0.025  0.019 -0.132  0.452  0.147  0.096 -0.007 -0.032
veg.sc                                   -0.543  0.574 -0.027 -0.010 -0.068 -0.128 -0.108  0.065 -0.146
duration.sc                              -0.134  0.121 -0.187  0.102 -0.026  0.072 -0.112  0.023 -0.208
human_bowler.sc                           0.065  0.062 -0.078 -0.106 -0.267 -0.011  0.165 -0.105 -0.048
temptrend_abs.sc:tsign1                   0.171 -0.362 -0.534 -0.016 -0.013 -0.007 -0.046  0.047  0.081
temptrend_abs.sc:tempave_metab.sc        -0.159  0.098 -0.029 -0.614 -0.427 -0.311  0.204 -0.189  0.196
temptrend_abs.sc:seas.sc                 -0.021  0.063  0.027 -0.352 -0.697 -0.152 -0.026 -0.180  0.187
temptrend_abs.sc:microclim.sc             0.039  0.000  0.013 -0.258 -0.174 -0.622  0.213 -0.074  0.034
temptrend_abs.sc:mass.sc                 -0.016 -0.069 -0.010  0.150 -0.015  0.239 -0.674  0.446 -0.105
temptrend_abs.sc:speed.sc                -0.130  0.244  0.058 -0.123 -0.179 -0.049  0.420 -0.644  0.022
temptrend_abs.sc:nspp.sc                 -0.072 -0.009  0.157  0.177  0.134  0.083 -0.160 -0.005 -0.624
tsign-1:thermal_bias.sc                   0.429 -0.242 -0.411  0.253  0.043  0.065 -0.035  0.048  0.091
tsign1:thermal_bias.sc                    0.218 -0.069  0.138  0.581  0.367  0.124  0.040  0.015 -0.204
temptrend_abs.sc:npp.sc                   0.014  0.271  0.009 -0.067 -0.351 -0.074 -0.028 -0.023  0.022
temptrend_abs.sc:veg.sc                   0.354 -0.817  0.020 -0.011  0.016  0.060  0.023 -0.036  0.006
temptrend_abs.sc:duration.sc              0.043 -0.011 -0.037  0.044  0.153  0.060  0.045  0.061  0.117
temptrend_abs.sc:human_bowler.sc         -0.018 -0.038  0.025  0.193  0.275  0.108 -0.232  0.190  0.007
temptrend_abs.sc:tsign-1:thermal_bias.sc -0.223  0.440  0.187 -0.198 -0.170 -0.066  0.098 -0.065  0.040
temptrend_abs.sc:tsign1:thermal_bias.sc  -0.099  0.022 -0.106 -0.344 -0.342 -0.044 -0.075 -0.026  0.075
                                         npp.sc veg.sc drtn.s hmn_b. tm_.:1 tmptrnd_bs.sc:t_.
temptrend_abs.sc                                                                             
tsign1                                                                                       
tempave_metab.sc                                                                             
seas.sc                                                                                      
microclim.sc                                                                                 
mass.sc                                                                                      
speed.sc                                                                                     
nspp.sc                                                                                      
npp.sc                                                                                       
veg.sc                                   -0.358                                              
duration.sc                               0.041  0.119                                       
human_bowler.sc                          -0.123  0.057  0.041                                
temptrend_abs.sc:tsign1                  -0.018 -0.047  0.054 -0.032                         
temptrend_abs.sc:tempave_metab.sc        -0.151 -0.024 -0.045  0.298 -0.040                  
temptrend_abs.sc:seas.sc                 -0.353  0.010  0.000  0.322 -0.050  0.779           
temptrend_abs.sc:microclim.sc            -0.108  0.098 -0.008  0.118 -0.070  0.524           
temptrend_abs.sc:mass.sc                  0.021  0.040  0.076 -0.298  0.097 -0.376           
temptrend_abs.sc:speed.sc                -0.042 -0.028  0.001  0.200 -0.093  0.226           
temptrend_abs.sc:nspp.sc                 -0.031  0.046  0.116 -0.059 -0.111 -0.251           
tsign-1:thermal_bias.sc                   0.126 -0.256  0.003  0.055  0.244 -0.183           
tsign1:thermal_bias.sc                    0.124  0.060  0.027  0.188 -0.140 -0.399           
temptrend_abs.sc:npp.sc                  -0.690  0.340 -0.066  0.117  0.033  0.341           
temptrend_abs.sc:veg.sc                   0.244 -0.692 -0.075 -0.037  0.106  0.071           
temptrend_abs.sc:duration.sc              0.044 -0.090 -0.342 -0.061  0.021 -0.044           
temptrend_abs.sc:human_bowler.sc          0.116  0.005 -0.030 -0.709  0.056 -0.499           
temptrend_abs.sc:tsign-1:thermal_bias.sc -0.246  0.236 -0.021  0.087 -0.477  0.423           
temptrend_abs.sc:tsign1:thermal_bias.sc  -0.216 -0.030  0.076 -0.004  0.173  0.585           
                                         tmptrnd_bs.sc:ss. tmptrnd_bs.sc:mc. tmptrnd_bs.sc:ms.
temptrend_abs.sc                                                                              
tsign1                                                                                        
tempave_metab.sc                                                                              
seas.sc                                                                                       
microclim.sc                                                                                  
mass.sc                                                                                       
speed.sc                                                                                      
nspp.sc                                                                                       
npp.sc                                                                                        
veg.sc                                                                                        
duration.sc                                                                                   
human_bowler.sc                                                                               
temptrend_abs.sc:tsign1                                                                       
temptrend_abs.sc:tempave_metab.sc                                                             
temptrend_abs.sc:seas.sc                                                                      
temptrend_abs.sc:microclim.sc             0.397                                               
temptrend_abs.sc:mass.sc                 -0.201            -0.358                             
temptrend_abs.sc:speed.sc                 0.319             0.166            -0.674           
temptrend_abs.sc:nspp.sc                 -0.150            -0.005             0.180           
tsign-1:thermal_bias.sc                  -0.117            -0.061             0.052           
tsign1:thermal_bias.sc                   -0.320            -0.052            -0.104           
temptrend_abs.sc:npp.sc                   0.459             0.196            -0.075           
temptrend_abs.sc:veg.sc                   0.032            -0.138            -0.023           
temptrend_abs.sc:duration.sc             -0.210            -0.189            -0.003           
temptrend_abs.sc:human_bowler.sc         -0.501            -0.182             0.480           
temptrend_abs.sc:tsign-1:thermal_bias.sc  0.374             0.182            -0.228           
temptrend_abs.sc:tsign1:thermal_bias.sc   0.520             0.087             0.003           
                                         tmptrnd_bs.sc:sp. tmptrnd_bs.sc:ns. t-1:_. ts1:_.
temptrend_abs.sc                                                                          
tsign1                                                                                    
tempave_metab.sc                                                                          
seas.sc                                                                                   
microclim.sc                                                                              
mass.sc                                                                                   
speed.sc                                                                                  
nspp.sc                                                                                   
npp.sc                                                                                    
veg.sc                                                                                    
duration.sc                                                                               
human_bowler.sc                                                                           
temptrend_abs.sc:tsign1                                                                   
temptrend_abs.sc:tempave_metab.sc                                                         
temptrend_abs.sc:seas.sc                                                                  
temptrend_abs.sc:microclim.sc                                                             
temptrend_abs.sc:mass.sc                                                                  
temptrend_abs.sc:speed.sc                                                                 
temptrend_abs.sc:nspp.sc                  0.016                                           
tsign-1:thermal_bias.sc                  -0.035            -0.028                         
tsign1:thermal_bias.sc                    0.034             0.041             0.196       
temptrend_abs.sc:npp.sc                   0.013             0.050            -0.173 -0.199
temptrend_abs.sc:veg.sc                   0.016            -0.022             0.144 -0.042
temptrend_abs.sc:duration.sc             -0.108            -0.279             0.071  0.059
temptrend_abs.sc:human_bowler.sc         -0.329             0.004            -0.006 -0.029
temptrend_abs.sc:tsign-1:thermal_bias.sc  0.072            -0.085            -0.534 -0.177
temptrend_abs.sc:tsign1:thermal_bias.sc  -0.045            -0.045            -0.159 -0.711
                                         tmptrnd_bs.sc:np. tmptrnd_bs.sc:v. tmptrnd_bs.sc:d.
temptrend_abs.sc                                                                            
tsign1                                                                                      
tempave_metab.sc                                                                            
seas.sc                                                                                     
microclim.sc                                                                                
mass.sc                                                                                     
speed.sc                                                                                    
nspp.sc                                                                                     
npp.sc                                                                                      
veg.sc                                                                                      
duration.sc                                                                                 
human_bowler.sc                                                                             
temptrend_abs.sc:tsign1                                                                     
temptrend_abs.sc:tempave_metab.sc                                                           
temptrend_abs.sc:seas.sc                                                                    
temptrend_abs.sc:microclim.sc                                                               
temptrend_abs.sc:mass.sc                                                                    
temptrend_abs.sc:speed.sc                                                                   
temptrend_abs.sc:nspp.sc                                                                    
tsign-1:thermal_bias.sc                                                                     
tsign1:thermal_bias.sc                                                                      
temptrend_abs.sc:npp.sc                                                                     
temptrend_abs.sc:veg.sc                  -0.513                                             
temptrend_abs.sc:duration.sc             -0.047             0.116                           
temptrend_abs.sc:human_bowler.sc         -0.145            -0.075            0.053          
temptrend_abs.sc:tsign-1:thermal_bias.sc  0.494            -0.339           -0.057          
temptrend_abs.sc:tsign1:thermal_bias.sc   0.411             0.068           -0.056          
                                         tmptrnd_bs.sc:h_. t_.:-1
temptrend_abs.sc                                                 
tsign1                                                           
tempave_metab.sc                                                 
seas.sc                                                          
microclim.sc                                                     
mass.sc                                                          
speed.sc                                                         
nspp.sc                                                          
npp.sc                                                           
veg.sc                                                           
duration.sc                                                      
human_bowler.sc                                                  
temptrend_abs.sc:tsign1                                          
temptrend_abs.sc:tempave_metab.sc                                
temptrend_abs.sc:seas.sc                                         
temptrend_abs.sc:microclim.sc                                    
temptrend_abs.sc:mass.sc                                         
temptrend_abs.sc:speed.sc                                        
temptrend_abs.sc:nspp.sc                                         
tsign-1:thermal_bias.sc                                          
tsign1:thermal_bias.sc                                           
temptrend_abs.sc:npp.sc                                          
temptrend_abs.sc:veg.sc                                          
temptrend_abs.sc:duration.sc                                     
temptrend_abs.sc:human_bowler.sc                                 
temptrend_abs.sc:tsign-1:thermal_bias.sc -0.153                  
temptrend_abs.sc:tsign1:thermal_bias.sc  -0.145             0.337

Standardized Within-Group Residuals:
        Min          Q1         Med          Q3         Max 
-4.25987257 -0.29069598 -0.02883191  0.25023757  5.23849247 

Number of Observations: 608
Number of Groups: 
              STUDY_ID rarefyID %in% STUDY_ID 
                    18                    608 
summary(modTfullHornMar)
Linear mixed-effects model fit by REML
 Data: trends[i3, ] 

Random effects:
 Formula: ~temptrend_abs.sc | STUDY_ID
 Structure: General positive-definite, Log-Cholesky parametrization
                 StdDev     Corr  
(Intercept)      0.02167793 (Intr)
temptrend_abs.sc 0.02656924 0.035 

 Formula: ~1 | rarefyID %in% STUDY_ID
        (Intercept) Residual
StdDev:  0.02055808 2.782391

Variance function:
 Structure: Power of variance covariate
 Formula: ~nyrBT 
 Parameter estimates:
    power 
-2.432839 
Fixed effects: Horntrendrem0 ~ temptrend_abs.sc * tsign + temptrend_abs.sc *      tempave_metab.sc + temptrend_abs.sc * seas.sc + temptrend_abs.sc *      microclim.sc + temptrend_abs.sc * mass.sc + temptrend_abs.sc *      speed.sc + temptrend_abs.sc * consumerfrac.sc + temptrend_abs.sc *      nspp.sc + temptrend_abs.sc * thermal_bias.sc:tsign + temptrend_abs.sc *      npp.sc + temptrend_abs.sc * duration.sc + temptrend_abs.sc *      human_bowler.sc 
 Correlation: 
                                         (Intr) tmpt_. tsign1 tmpv_. ses.sc mcrcl. mss.sc spd.sc cnsmr.
temptrend_abs.sc                         -0.263                                                        
tsign1                                   -0.188  0.115                                                 
tempave_metab.sc                          0.102 -0.003  0.022                                          
seas.sc                                   0.185 -0.084 -0.091  0.221                                   
microclim.sc                              0.037 -0.045  0.008 -0.204  0.067                            
mass.sc                                   0.058 -0.033  0.000  0.062  0.037  0.012                     
speed.sc                                  0.153 -0.080 -0.079  0.072  0.073  0.039 -0.434              
consumerfrac.sc                           0.000  0.012  0.029 -0.068 -0.012  0.012 -0.055  0.000       
nspp.sc                                  -0.131  0.096  0.058 -0.114  0.092 -0.084 -0.105  0.204  0.112
npp.sc                                   -0.043  0.057 -0.002 -0.053 -0.345 -0.238 -0.024  0.081 -0.040
duration.sc                               0.041 -0.022 -0.137  0.053 -0.064 -0.016 -0.001 -0.016 -0.016
human_bowler.sc                          -0.030  0.030  0.005  0.098 -0.193  0.005 -0.026  0.040 -0.055
temptrend_abs.sc:tsign1                   0.089 -0.249 -0.520 -0.048 -0.009 -0.003  0.008  0.032 -0.017
temptrend_abs.sc:tempave_metab.sc        -0.031  0.078 -0.081 -0.437 -0.161  0.032 -0.019  0.058  0.040
temptrend_abs.sc:seas.sc                 -0.078  0.140  0.048 -0.144 -0.689 -0.051 -0.018 -0.038 -0.016
temptrend_abs.sc:microclim.sc            -0.022  0.066 -0.016  0.131 -0.010 -0.723  0.014 -0.028 -0.003
temptrend_abs.sc:mass.sc                  0.002  0.093  0.012 -0.038 -0.016  0.026 -0.573  0.252  0.060
temptrend_abs.sc:speed.sc                -0.031  0.176  0.047  0.026 -0.018 -0.039  0.237 -0.575  0.016
temptrend_abs.sc:consumerfrac.sc         -0.013 -0.027 -0.018  0.051  0.006  0.017  0.052  0.007 -0.719
temptrend_abs.sc:nspp.sc                  0.038 -0.174 -0.024  0.031 -0.065  0.046  0.026 -0.170 -0.064
tsign-1:thermal_bias.sc                   0.037  0.000 -0.166  0.241 -0.140 -0.031 -0.046  0.047 -0.004
tsign1:thermal_bias.sc                    0.006 -0.004  0.129  0.432 -0.171 -0.128 -0.002  0.027 -0.005
temptrend_abs.sc:npp.sc                   0.007 -0.082  0.014  0.031  0.208  0.182 -0.009 -0.036  0.014
temptrend_abs.sc:duration.sc             -0.104  0.249  0.028  0.111  0.011 -0.038  0.036  0.016  0.030
temptrend_abs.sc:human_bowler.sc          0.029 -0.029 -0.017 -0.067  0.145 -0.007  0.023 -0.033  0.133
temptrend_abs.sc:tsign-1:thermal_bias.sc -0.012  0.010  0.028 -0.091  0.105  0.023  0.013  0.009 -0.003
temptrend_abs.sc:tsign1:thermal_bias.sc   0.006 -0.004 -0.104 -0.174  0.072  0.038  0.012  0.042 -0.019
                                         nspp.s npp.sc drtn.s hmn_b. tm_.:1 tmptrnd_bs.sc:t_.
temptrend_abs.sc                                                                             
tsign1                                                                                       
tempave_metab.sc                                                                             
seas.sc                                                                                      
microclim.sc                                                                                 
mass.sc                                                                                      
speed.sc                                                                                     
consumerfrac.sc                                                                              
nspp.sc                                                                                      
npp.sc                                   -0.237                                              
duration.sc                              -0.279  0.065                                       
human_bowler.sc                          -0.051 -0.158  0.018                                
temptrend_abs.sc:tsign1                  -0.036 -0.002  0.018 -0.006                         
temptrend_abs.sc:tempave_metab.sc         0.038  0.018  0.022 -0.044  0.092                  
temptrend_abs.sc:seas.sc                 -0.057  0.261  0.016  0.155  0.013  0.196           
temptrend_abs.sc:microclim.sc             0.052  0.180  0.004 -0.028 -0.019  0.029           
temptrend_abs.sc:mass.sc                  0.028 -0.019  0.033  0.031 -0.013  0.041           
temptrend_abs.sc:speed.sc                -0.167 -0.017  0.027 -0.043 -0.019 -0.156           
temptrend_abs.sc:consumerfrac.sc         -0.087  0.016 -0.004  0.075  0.046 -0.049           
temptrend_abs.sc:nspp.sc                 -0.643  0.144  0.179  0.044  0.032 -0.064           
tsign-1:thermal_bias.sc                  -0.055 -0.011  0.077  0.141  0.042 -0.054           
tsign1:thermal_bias.sc                   -0.059 -0.118  0.093  0.170 -0.076 -0.125           
temptrend_abs.sc:npp.sc                   0.133 -0.656 -0.036  0.097 -0.050 -0.027           
temptrend_abs.sc:duration.sc              0.253 -0.038 -0.484  0.034 -0.079 -0.042           
temptrend_abs.sc:human_bowler.sc          0.039  0.105 -0.005 -0.735  0.018  0.089           
temptrend_abs.sc:tsign-1:thermal_bias.sc  0.008 -0.003 -0.030 -0.083  0.059  0.277           
temptrend_abs.sc:tsign1:thermal_bias.sc   0.015  0.082 -0.046 -0.122  0.164  0.469           
                                         tmptrnd_bs.sc:ss. tmptrnd_bs.sc:mc. tmptrnd_bs.sc:ms.
temptrend_abs.sc                                                                              
tsign1                                                                                        
tempave_metab.sc                                                                              
seas.sc                                                                                       
microclim.sc                                                                                  
mass.sc                                                                                       
speed.sc                                                                                      
consumerfrac.sc                                                                               
nspp.sc                                                                                       
npp.sc                                                                                        
duration.sc                                                                                   
human_bowler.sc                                                                               
temptrend_abs.sc:tsign1                                                                       
temptrend_abs.sc:tempave_metab.sc                                                             
temptrend_abs.sc:seas.sc                                                                      
temptrend_abs.sc:microclim.sc             0.053                                               
temptrend_abs.sc:mass.sc                  0.005            -0.063                             
temptrend_abs.sc:speed.sc                 0.067             0.051            -0.412           
temptrend_abs.sc:consumerfrac.sc         -0.029            -0.039            -0.112           
temptrend_abs.sc:nspp.sc                  0.061            -0.014            -0.009           
tsign-1:thermal_bias.sc                   0.091             0.011             0.023           
tsign1:thermal_bias.sc                    0.065             0.049             0.017           
temptrend_abs.sc:npp.sc                  -0.379            -0.338             0.065           
temptrend_abs.sc:duration.sc             -0.046             0.044            -0.068           
temptrend_abs.sc:human_bowler.sc         -0.171            -0.022            -0.025           
temptrend_abs.sc:tsign-1:thermal_bias.sc -0.127            -0.034            -0.014           
temptrend_abs.sc:tsign1:thermal_bias.sc  -0.069            -0.123            -0.016           
                                         tmptrnd_bs.sc:sp. tmptrnd_bs.sc:c. tmptrnd_bs.sc:ns. t-1:_.
temptrend_abs.sc                                                                                    
tsign1                                                                                              
tempave_metab.sc                                                                                    
seas.sc                                                                                             
microclim.sc                                                                                        
mass.sc                                                                                             
speed.sc                                                                                            
consumerfrac.sc                                                                                     
nspp.sc                                                                                             
npp.sc                                                                                              
duration.sc                                                                                         
human_bowler.sc                                                                                     
temptrend_abs.sc:tsign1                                                                             
temptrend_abs.sc:tempave_metab.sc                                                                   
temptrend_abs.sc:seas.sc                                                                            
temptrend_abs.sc:microclim.sc                                                                       
temptrend_abs.sc:mass.sc                                                                            
temptrend_abs.sc:speed.sc                                                                           
temptrend_abs.sc:consumerfrac.sc         -0.042                                                     
temptrend_abs.sc:nspp.sc                  0.212             0.115                                   
tsign-1:thermal_bias.sc                  -0.015            -0.001            0.009                  
tsign1:thermal_bias.sc                   -0.004             0.002            0.000             0.358
temptrend_abs.sc:npp.sc                  -0.012            -0.003           -0.152            -0.005
temptrend_abs.sc:duration.sc             -0.044             0.024           -0.356            -0.028
temptrend_abs.sc:human_bowler.sc          0.038            -0.153           -0.057            -0.092
temptrend_abs.sc:tsign-1:thermal_bias.sc -0.047             0.029           -0.009            -0.482
temptrend_abs.sc:tsign1:thermal_bias.sc  -0.124             0.050           -0.033            -0.177
                                         ts1:_. tmptrnd_bs.sc:np. tmptrnd_bs.sc:d. tmptrnd_bs.sc:h_.
temptrend_abs.sc                                                                                    
tsign1                                                                                              
tempave_metab.sc                                                                                    
seas.sc                                                                                             
microclim.sc                                                                                        
mass.sc                                                                                             
speed.sc                                                                                            
consumerfrac.sc                                                                                     
nspp.sc                                                                                             
npp.sc                                                                                              
duration.sc                                                                                         
human_bowler.sc                                                                                     
temptrend_abs.sc:tsign1                                                                             
temptrend_abs.sc:tempave_metab.sc                                                                   
temptrend_abs.sc:seas.sc                                                                            
temptrend_abs.sc:microclim.sc                                                                       
temptrend_abs.sc:mass.sc                                                                            
temptrend_abs.sc:speed.sc                                                                           
temptrend_abs.sc:consumerfrac.sc                                                                    
temptrend_abs.sc:nspp.sc                                                                            
tsign-1:thermal_bias.sc                                                                             
tsign1:thermal_bias.sc                                                                              
temptrend_abs.sc:npp.sc                   0.086                                                     
temptrend_abs.sc:duration.sc             -0.055  0.054                                              
temptrend_abs.sc:human_bowler.sc         -0.124 -0.140            -0.020                            
temptrend_abs.sc:tsign-1:thermal_bias.sc -0.174  0.011             0.066            0.087           
temptrend_abs.sc:tsign1:thermal_bias.sc  -0.571 -0.084             0.037            0.137           
                                         t_.:-1
temptrend_abs.sc                               
tsign1                                         
tempave_metab.sc                               
seas.sc                                        
microclim.sc                                   
mass.sc                                        
speed.sc                                       
consumerfrac.sc                                
nspp.sc                                        
npp.sc                                         
duration.sc                                    
human_bowler.sc                                
temptrend_abs.sc:tsign1                        
temptrend_abs.sc:tempave_metab.sc              
temptrend_abs.sc:seas.sc                       
temptrend_abs.sc:microclim.sc                  
temptrend_abs.sc:mass.sc                       
temptrend_abs.sc:speed.sc                      
temptrend_abs.sc:consumerfrac.sc               
temptrend_abs.sc:nspp.sc                       
tsign-1:thermal_bias.sc                        
tsign1:thermal_bias.sc                         
temptrend_abs.sc:npp.sc                        
temptrend_abs.sc:duration.sc                   
temptrend_abs.sc:human_bowler.sc               
temptrend_abs.sc:tsign-1:thermal_bias.sc       
temptrend_abs.sc:tsign1:thermal_bias.sc   0.341

Standardized Within-Group Residuals:
        Min          Q1         Med          Q3         Max 
-5.59847381 -0.21790065 -0.02487884  0.21515504  5.76491820 

Number of Observations: 32420
Number of Groups: 
              STUDY_ID rarefyID %in% STUDY_ID 
                    92                  32420 

Plot the realm-specific coefficients

Also uses the full models across all realms


coefs1 <- summary(modTfullHornrem0)$tTable
coefs2 <- summary(modTfullHornTerr)$tTable
coefs3 <- summary(modTfullHornFresh)$tTable
coefs4 <- summary(modTfullHornMar)$tTable

varstoplot <- unique(c(rownames(coefs1), rownames(coefs2), rownames(coefs3), rownames(coefs4)))
varstoplot <- varstoplot[which(!grepl('Intercept', varstoplot) | grepl(':', varstoplot))] # vars to plot

rows1_1 <- which(rownames(coefs1) %in% varstoplot) # rows in coefs
rows1_2 <- which(rownames(coefs2) %in% varstoplot)
rows1_3 <- which(rownames(coefs3) %in% varstoplot)
rows1_4 <- which(rownames(coefs4) %in% varstoplot)
xlims <- range(c(coefs1[rows1_1,1] - coefs1[rows1_1,2], coefs1[rows1_1,1] + coefs1[rows1_1,2], 
                 coefs2[rows1_2,1] - coefs2[rows1_2,2], coefs2[rows1_2,1] + coefs2[rows1_2,2], 
                 coefs3[rows1_3,1] - coefs3[rows1_3,2], coefs3[rows1_3,1] + coefs3[rows1_3,2],
                 coefs4[rows1_4,1] - coefs4[rows1_4,2], coefs4[rows1_4,1] + coefs4[rows1_4,2]))


cols <- brewer.pal(4, 'Dark2') # for full, terr, fresh, mar
pchs <- c(1, 16, 16, 16)
offs <- c(0.1, 0, -0.1, -0.2) # offset vertically for each model


par(las = 1, mai = c(0.5, 4, 0.1, 0.1))

plot(0,0, col = 'white', xlim = xlims, ylim = c(1,length(varstoplot)), yaxt='n', xlab = '', ylab ='')
axis(2, at = length(varstoplot):1, labels = varstoplot, cex.axis = 0.7)
abline(v = 0, col = 'grey', lty = 2)
abline(h = 1:length(varstoplot), col = 'grey', lty = 3)
for(i in 1:length(varstoplot)){
  if(varstoplot[i] %in% rownames(coefs1)){
    x = coefs1[rownames(coefs1) == varstoplot[i], 1]
    se = coefs1[rownames(coefs1) == varstoplot[i], 2]
    points(x, length(varstoplot) + 1 - i + offs[1], pch = pchs[1], col = cols[1])
    lines(x = c(x-se, x+se), y = c(length(varstoplot) + 1 - i + offs[1], length(varstoplot) + 1 - i + offs[1]), col = cols[1])
  }
  if(varstoplot[i] %in% rownames(coefs2)){
    x = coefs2[rownames(coefs2) == varstoplot[i], 1]
    se = coefs2[rownames(coefs2) == varstoplot[i], 2]
    points(x, length(varstoplot) + 1 - i + offs[2], pch = pchs[2], col = cols[2])
    lines(x = c(x-se, x+se), y = c(length(varstoplot) + 1 - i + offs[2], length(varstoplot) + 1 - i + offs[2]), col = cols[2])
  }
  if(varstoplot[i] %in% rownames(coefs3)){
    x = coefs3[rownames(coefs3) == varstoplot[i], 1]
    se = coefs3[rownames(coefs3) == varstoplot[i], 2]
    points(x, length(varstoplot) + 1 - i + offs[3], pch = pchs[3], col = cols[3])
    lines(x = c(x-se, x+se), y = c(length(varstoplot) + 1 - i + offs[3], length(varstoplot) + 1 - i + offs[3]), col = cols[3])
  }
  if(varstoplot[i] %in% rownames(coefs4)){
    x = coefs4[rownames(coefs4) == varstoplot[i], 1]
    se = coefs4[rownames(coefs4) == varstoplot[i], 2]
    points(x, length(varstoplot) + 1 - i + offs[4], pch = pchs[4], col = cols[4])
    lines(x = c(x-se, x+se), y = c(length(varstoplot) + 1 - i + offs[4], length(varstoplot) + 1 - i + offs[4]), col = cols[4])
  }
}
legend('bottomleft', col = cols, pch = pchs, lwd = 1, legend = c('All', 'Terestrial', 'Freshwater', 'Marine'))

[End text in hopes this helps the last figure show up when knitted]

LS0tCnRpdGxlOiAnRHJpdmVycyBvZiB2YXJpYXRpb24gaW4gdGhlIGNvbW11bml0eSByZXNwb25zZSB0byB0ZW1wZXJhdHVyZSBjaGFuZ2UgYWNyb3NzIHJlYWxtcycKc3VidGl0bGU6ICcodXNpbmcgbWl4ZWQgZWZmZWN0cyBtb2RlbHMpJwpvdXRwdXQ6IAogICAgZ2l0aHViX2RvY3VtZW50OiBkZWZhdWx0CiAgICAjaHRtbF9kb2N1bWVudDogZGVmYXVsdAogICAgaHRtbF9ub3RlYm9vazogZGVmYXVsdAotLS0KCkNvbGxhYm9yYXRvcnM6IFNoYW5lIEJsb3dlcywgSm9uIENoYXNlLCBIZWxtdXQgSGlsbGVicmFuZCwgTWljaGFlbCBCdXJyb3dzLCBBbWFuZGEgQmF0ZXMsIFVsaSBCcm9zZSwgQmVub2l0IEdhdXplbnMsIExhdXJhIEFudGFvLCBSdWJlbiBSZW1lbGdhZG8sIENhcnN0ZW4gTWV5ZXIsIE15cmlhbSBIaXJ0LCBtYXliZSBvdGhlcnMKQXNzaXN0YW5jZTogS2F0aGVyaW5lIExldywgSm9zZWYgSGF1c2VyCgojIEludHJvZHVjdGlvbgotIENsaW1hdGUgY2hhbmdlIGlzIGRyaXZpbmcgYSB3aWRlc3ByZWFkIHJlb3JnYW5pemF0aW9uIG9mIGVjb2xvZ2ljYWwgY29tbXVuaXRpZXMgYXJvdW5kIHRoZSB3b3JsZCAoUGFybXNlc2FuICYgWW9oZSAyMDAzLCBQb2xvY3phbnNrYSBldCBhbC4gMjAxMyksCi0gYnV0IHRoZSBpbXBhY3RzIG9mIGNsaW1hdGUgY2hhbmdlIHZhcnkgc3Vic3RhbnRpYWxseSBmcm9tIG9uZSBsb2NhdGlvbiB0byBhbm90aGVyIGFuZCBhbW9uZyB0YXhhIChNb2xpbm9zIGV0IGFsLiAyMDE2IE5DQywgQW50YW8gZXQgYWwuIDIwMjAgTkVFKS4KLSBDb21tdW5pdHkgcmVvcmdhbml6YXRpb24gaXMgc3Vic3RhbnRpYWxseSBtb3JlIGNvbW1vbiB0aGFuIGFuIGFnZ3JlZ2F0ZSBsb3NzIG9yIGdhaW4gb2Ygc3BlY2llcyAoRG9ybmVsYXMgZXQgYWwuIDIwMTQgU2NpZW5jZSwgQmxvd2VzIGV0IGFsLiAyMDE5IFNjaWVuY2UsIEhpbGxlYnJhbmQgZXQgYWwuIDIwMTcgSiBBcHBsIEVjb2wpCi0gVGhlcmUgYXJlIG1hbnkgaHlwb3RoZXNlcyBmb3Igd2h5IHNvbWUgY29tbXVuaXRpZXMgYXJlIG1vcmUgc2Vuc2l0aXZlIHRvIHdhcm1pbmcgdGhhbiBvdGhlcnMsIGluY2x1ZGluZyBkaWZmZXJlbmNlcyBpbgogIC0gbWV0YWJvbGljIHJhdGVzIChEaWxsb24gZXQgYWwuIDIwMTAgTmF0dXJlKSwgCiAgLSB0aGVybWFsIHBoeXNpb2xvZ3kgKERldXRzY2ggZXQgYWwuIDIwMDggUE5BUywgUGluc2t5IGV0IGFsLiAyMDE5IE5hdHVyZSksIAogIC0gbWljcm9jbGltYXRlIGF2YWlsYWJpbGl0eSAoQnVycm93cyBldCBhbC4gMjAxOSBOQ0MsIFN1Z2dpdHQgZXQgYWwuIDIwMTggTkNDKSwKICAtIHNwZWNpZXMgbW9iaWxpdHkgKFBvbG9jemFuc2thIGV0IGFsLiAyMDEzIE5DQywgQnVycm93cyBldCBhbC4gMjAxMSBTY2llbmNlLCBTdW5kYXkgZXQgYWwuIDIwMTIgTkNDKQogIC0gb3IgZ2VuZXJhdGlvbiB0aW1lIChCZWF1Z3JhbmQgZXQgYWwuIDIwMDkgRFNSIElJLCBQb2xvY3phbnNrYSBldCBhbC4gMjAxMyBOQ0MpLAogIC0gY29uc3VtZXJzIHZzLiBwcm9kdWNlcnMgKFBldGNoZXkgZXQgYWwuIDE5OTkgTmF0dXJlKQogIC0gY29tbXVuaXR5IGNvbXBvc2l0aW9uIChTdHVhcnQtU21pdGggZXQgYWwuIDIwMTUgTmF0dXJlLCBCZWF1Z3JhbmQgZXQgYS4gMjAxNSBOQ0MsIFRyaXNvcyBldCBhbC4gMjAyMCBOYXR1cmUpLCAKICAtIGVjb3N5c3RlbSBwcm9kdWN0aXZpdHkgKFRob21hcyBldCBhbC4gMjAxNyBHQ0IsIEJyZXR0IDE5NzEgQW0gWm9vKSwKICAtIGV4cG9zdXJlIHRvIGh1bWFuIGltcGFjdHMgKFdoaXRlICYgS2VyciAyMDA2IEVjb2dyYXBoeSkKICAtIGFuZCBhbW9uZyByZWFsbXMgKEFudGFvIGV0IGFsLiAyMDIwIE5FRSkuCi0gU2NhbGluZyB1cCBmcm9tIG9yZ2FuaXNtYWwgZWZmZWN0cyB0byB3aG9sZSBlY29sb2dpY2FsIGNvbW11bml0aWVzIGlzIGNvbXBsZXgsIGFuZCB5ZXQgdGhlc2Ugc2NhbGVzIGFyZSBjcml0aWNhbCBmb3IgZWNvc3lzdGVtIGZ1bmN0aW9uaW5nIGFuZCBodW1hbiB3ZWxsLWJlaW5nLiAKLSBUaGVyZSBpcyBhIG5lZWQgZm9yIGEgY29tcHJlaGVuc2l2ZSB0ZXN0IHRvIHVuZGVyc3RhbmQgd2hlcmUgd2FybWluZyBpcyBkcml2aW5nIGFuZCBpcyBsaWtlbHkgdG8gZHJpdmUgdGhlIG1vc3QgZHJhbWF0aWMgY29tbXVuaXR5IHR1cm5vdmVyCgojIE1ldGhvZHMKLSBCaW9UaW1lIGRhdGFzZXQsIGdyaWRkZWQgdG8gOTYga20yIGhleGFnb25zLCBzdW1tYXJpemVkIGFzIHRlbXBvcmFsIHR1cm5vdmVyIChCbG93ZXMpCiAgLSBUZW1wb3JhbCBzbG9wZSBvZiBKYWNjYXJkIHR1cm5vdmVyIGNvbXBhcmVkIHRvIHRoZSBmaXJzdCB5ZWFyIChOT1QgaW5jbHVkaW5nIHRoZSBmaXJzdCB5ZWFyIGNvbXBhcmVkIHRvIGl0c2VsZikKICAtIFNhbWUgZm9yIEphY2NhcmQgdG90YWwKICAtIGFuZCBNb3Jpc2l0YS1Ib3JuIHR1cm5vdmVyCi0gRXhwbGFuYXRvcnkgdmFyaWFibGVzIGNvbnNpZGVyZWQgZm9yIGRpZmZlcmVuY2VzIGluIHJhdGUgb2YgdHVybm92ZXI6CiAgLSBUZW1wZXJhdHVyZSB0cmVuZCBvdmVyIHRoZSB0aW1lLWZyYW1lIG9mIGVhY2ggdGltZS1zZXJpZXMgKENSVSBUUyA0LjAzIG9uIGxhbmQgYW5kIGluIGZyZXNod2F0ZXIsIEVSU1NUIHY1IGluIHRoZSBvY2VhbikKICAtIFNlYXNvbmFsaXR5IGFzIGEgbWV0cmljIG9mIHRoZXJtYWwgc2Vuc2l0aXZpdHkgKERldXRzY2ggZXQgYWwuIDIwMDggUE5BUykuIFN0YW5kYXJkIGRldmlhdGlvbiBvZiBtb250aGx5IHRlbXBlcmF0dXJlcy4KICAtIE1pY3JvY2xpbWF0ZXMgY2FsY3VsYXRlZCBmcm9tIFdvcmxkQ2xpbSBhbmQgQmlvT3JhY2xlIChMYXVyYSBBbnRhbykKICAtIEJvZHkgbWFzcywgY29sbGF0ZWQgZnJvbSBkYXRhYmFzZXMgYW5kIGxpdGVyYXR1cmUgc2VhcmNoZXMKICAtIE1ldGFib2xpYyB0ZW1wZXJhdHVyZSwgZnJvbSBhdmVyYWdlIHRlbXBlcmF0dXJlIGlmIGVjdG90aGVybXMgKERpbGxvbiBldCBhbC4gMjAxMCBOYXR1cmUsIEFudGFvIGV0IGFsLiAyMDIwIE5hdCBFJkUpCiAgLSBNb2JpbGl0eSBjYWxjdWxhdGVkIGZyb20gYm9keSBtYXNzIGFuZCB0YXhvbm9taWMgZ3JvdXAgY2xhc3NpZmljYXRpb25zIG9mIG1vYmlsaXR5IG1vZGUgKGZseSwgcnVuLCBzd2ltLCBjcmF3bCwgc2Vzc2lsZSkuIEZseS9ydW4vc3dpbSBmb2xsb3dlZCB0aGUgYWxsb21ldHJpYyByZWxhdGlvbnNoaXAgaW4gSGlydCBldCBhbC4gMjAxNyBOYXQgRSZFLiBDcmF3bCBzZXQgYXQgMC4xIGttL2hyLCBzZXNzaWxlIHNldCB0byAwIGttL2hyLiBUaGVuIGNhbGN1bGF0ZWQgYXZlcmFnZWQgd2l0aGluIGVhY2ggYXNzZW1ibGFnZS4KICAtIEdlbmVyYXRpb24gdGltZSBjYWxjdWxhdGVkIGZyb20gYm9keSBtYXNzIGFuZCBlbmRvdGhlcm0gdnMuIGVjdG90aGVybSBjbGFzc2lmaWNhdGlvbnMsIGZvbGxvd2luZyBNY0NveSAmIEdpbGxvb2x5IDIwMDggRUxFLiBBdmVyYWdlZCBhY3Jvc3Mgc3BlY2llcyB3aXRoaW4gZWFjaCBhc3NlbWJsYWdlLiAKICAtIENvbnN1bWVyIHZzLiBwcm9kdWNlciBjbGFzc2lmaWNhdGlvbiBieSBzcGVjaWVzCiAgLSBFbmRvdGhlcm0gdnMuIGVjdG90aGVybSBjbGFzc2lmaWNhdGlvbiBieSBzcGVjaWVzCiAgLSBTcGVjaWVzIHJpY2huZXNzLCBjYWxjdWxhdGVkIGFzIHRoZSBudW1iZXIgb2Ygc3BlY2llcyBpbiB0aGUgYXNzZW1ibGFnZQogIC0gTmV0IHByaW1hcnkgcHJvZHVjdGl2aXR5IChOUFApIGZyb20gdGhlIG1lcmdlZCBsYW5kL29jZWFuIHByb2R1Y3QgcHJvZHVjZWQgYnkgdGhlIFtPY2VhbiBQcm9kdWN0aXZpdHldKGh0dHA6Ly93d3cuc2NpZW5jZS5vcmVnb25zdGF0ZS5lZHUvb2NlYW4ucHJvZHVjdGl2aXR5LykgZ3JvdXAgYXQgT3JlZ29uIFN0YXRlIHVzaW5nIG1ldGhvZHMgZnJvbSBaaGFvIGV0IGFsLiAyMDA1IGFuZCBCZWhyZW5mZWxkICYgRmFsa293c2tpIDE5OTcuIAogIC0gSHVtYW4gaW1wYWN0IGNhbGN1bGF0ZWQgZnJvbSBCb3dsZXIgZXQgYWwuIDIwMjAgKGFsc28gdHJ5IGRhdGEgZnJvbSBWZW50ZXIgZXQgYWwuIDIwMTYgYW5kIEhhbHBlcm4gZXQgYWwuIDIwMDgpCiAgLSBUaGVybWFsIGJpYXMgY2FsY3VsYXRlZCBmcm9tIFNwZWNpZXMgVGVtcGVyYXR1cmUgSW5kaWNlcyAoTWlrZSBCdXJyb3dzKQogIC0gVmVnZXRhdGlvbiBjb3ZlciBpbmRleCwgY2FsY3VsYXRlZCBmcm9tICV0cmVlIGNvdmVyIGFuZCAlbm9uLXRyZWUgdmVnIGNvdmVyIChsYXR0ZXIgY291bnRlZCBhcyAxLzIpLCBmcm9tIHZlZ2V0YXRpb24gY29udGludW91cyBmaWVsZHMgKFJ1YmVuIFJlbWVsZ2FkbykKLSBEaWZmZXJlbmNlcyBpbiB0ZW1wb3JhbCB0dXJub3ZlciAocmVzcG9uc2UgdmFyaWFibGUpIG1vZGVsZWQgd2l0aCBhIGxpbmVhciBtaXhlZCBlZmZlY3RzIG1vZGVsIChubG1lIHBhY2thZ2UsIGxtZSgpIGZ1bmN0aW9uKS4gU2VlIGJlbG93IGZvciBkZXRhaWxzLgoKYGBge3Igc2V0dXB9CmxpYnJhcnkoZGF0YS50YWJsZSkgIyBmb3IgaGFuZGxpbmcgbGFyZ2UgZGF0YXNldHMKbGlicmFyeShnZ3Bsb3QyKSAjIGZvciBzb21lIHBsb3R0aW5nCmxpYnJhcnkobmxtZSkgIyBmb3IgTUUgbW9kZWxzCmxpYnJhcnkobWFwcykgIyBmb3IgbWFwCmxpYnJhcnkoZ3JpZEV4dHJhKSAjIHRvIGNvbWJpbmUgZ2dwbG90cyB0b2dldGhlcgpsaWJyYXJ5KGdyaWQpICMgdG8gY29tYmluZSBnZ3Bsb3RzIHRvZ2V0aGVyCmxpYnJhcnkoUkNvbG9yQnJld2VyKQpsaWJyYXJ5KE1BU1MpICMgZm9yIHN0ZXBBSUMKbGlicmFyeShwaWVjZXdpc2VTRU0pICMgZm9yIHJzcXVhcmVkKCkgZm9yIG5sbWUgbW9kZWxzCgpvcHRpb25zKHdpZHRoPTUwMCkgIyB0dXJuIG9mZiBtb3N0IHRleHQgd3JhcHBpbmcKCiMgdGVsbCBSU3R1ZGlvIHRvIHVzZSBwcm9qZWN0IHJvb3QgZGlyZWN0b3J5IGFzIHRoZSByb290IGZvciB0aGlzIG5vdGVib29rLiBOZWVkZWQgc2luY2Ugd2UgYXJlIHN0b3JpbmcgY29kZSBpbiBhIHNlcGFyYXRlIGRpcmVjdG9yeS4Ka25pdHI6Om9wdHNfa25pdCRzZXQocm9vdC5kaXIgPSBycHJvanJvb3Q6OmZpbmRfcnN0dWRpb19yb290X2ZpbGUoKSkgCmBgYAoKYGBge3IgbG9hZCBkYXRhfQojIFR1cm5vdmVyIGFuZCBjb3ZhcmlhdGVzIGFzc2VtYmxlZCBieSB0dXJub3Zlcl92c190ZW1wZXJhdHVyZV9wcmVwLlJtZAp0cmVuZHMgPC0gZnJlYWQoJ291dHB1dC90dXJub3Zlcl93X2NvdmFyaWF0ZXMuY3N2Lmd6JykKCiMgc2V0IHJlYWxtIG9yZGVyCnRyZW5kc1ssIFJFQUxNIDo9IGZhY3RvcihSRUFMTSwgbGV2ZWxzID0gYygnRnJlc2h3YXRlcicsICdNYXJpbmUnLCAnVGVycmVzdHJpYWwnKSwgb3JkZXJlZCA9IEZBTFNFKV0KCiMgc2V0IHVwIHNpZ24gb2YgdGVtcGVyYXR1cmUgY2hhbmdlCnRyZW5kc1ssIHRzaWduIDo9IGZhY3RvcihzaWduKHRlbXB0cmVuZCkpXQoKIyByZWFsbSB0aGF0IGNvbWJpbmVkIFRlcnJlc3RyaWFsIGFuZCBGcmVzaHdhdGVyLCBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBodW1hbiBpbXBhY3QKdHJlbmRzWywgUkVBTE0yIDo9IFJFQUxNXQpsZXZlbHModHJlbmRzJFJFQUxNMikgPSBsaXN0KFRlcnJGcmVzaCA9ICJGcmVzaHdhdGVyIiwgVGVyckZyZXNoID0gIlRlcnJlc3RyaWFsIiwgTWFyaW5lID0gIk1hcmluZSIpCgojIGdyb3VwIE1hcmluZSBpbnZlcnRlYnJhdGVzL3BsYW50cyBpbiB3aXRoIEFsbAp0cmVuZHNbLCB0YXhhX21vZDIgOj0gdGF4YV9tb2RdCnRyZW5kc1t0YXhhX21vZCA9PSAnTWFyaW5lIGludmVydGVicmF0ZXMvcGxhbnRzJywgdGF4YV9tb2QyIDo9ICdBbGwnXQoKIyBjYWxjdWxhdGUgZHVyYXRpb24KdHJlbmRzWywgZHVyYXRpb24gOj0gbWF4eXJCVCAtIG1pbnlyQlQgKyAxXQoKIyB0cmltIHRvIGRhdGEgd2l0aCA+PSAzIHlycwp0cmVuZHMgPC0gdHJlbmRzW255ckJUID49IDMsIF0KYGBgCgoKIyMjIExvZy10cmFuc2Zvcm0gc29tZSB2YXJpYWJsZXMsIHRoZW4gY2VudGVyIGFuZCBzY2FsZS4gCmBgYCB7ciBjZW50ZXIgYW5kIHNjYWxlfQp0cmVuZHNbLCB0ZW1wYXZlLnNjIDo9IHNjYWxlKHRlbXBhdmUpXQp0cmVuZHNbLCB0ZW1wYXZlX21ldGFiLnNjIDo9IHNjYWxlKHRlbXBhdmVfbWV0YWIpXQp0cmVuZHNbLCBzZWFzLnNjIDo9IHNjYWxlKHNlYXMpXQp0cmVuZHNbLCBtaWNyb2NsaW0uc2MgOj0gc2NhbGUobG9nKG1pY3JvY2xpbSkpXQp0cmVuZHNbLCB0ZW1wdHJlbmQuc2MgOj0gc2NhbGUodGVtcHRyZW5kLCBjZW50ZXIgPSBGQUxTRSldICMgZG8gbm90IGNlbnRlcgp0cmVuZHNbLCB0ZW1wdHJlbmRfYWJzLnNjIDo9IHNjYWxlKGFicyh0ZW1wdHJlbmQpLCBjZW50ZXIgPSBGQUxTRSldICMgZG8gbm90IGNlbnRlciwgc28gdGhhdCAwIGlzIHN0aWxsIDAgdGVtcGVyYXR1cmUgY2hhbmdlCnRyZW5kc1ssIG1hc3Muc2MgOj0gc2NhbGUobG9nKG1hc3NfbWVhbl93ZWlnaHQpKV0KdHJlbmRzWywgc3BlZWQuc2MgOj0gc2NhbGUobG9nKHNwZWVkX21lYW5fd2VpZ2h0KzEpKV0KdHJlbmRzWywgbGlmZXNwYW4uc2MgOj0gc2NhbGUobG9nKGxpZmVzcGFuX21lYW5fd2VpZ2h0KSldCnRyZW5kc1ssIGNvbnN1bWVyZnJhYy5zYyA6PSBzY2FsZShjb25zZnJhYyldCnRyZW5kc1ssIGVuZG90aGVybWZyYWMuc2MgOj0gc2NhbGUoZW5kb2ZyYWMpXQp0cmVuZHNbLCBuc3BwLnNjIDo9IHNjYWxlKGxvZyhOc3BwKSldCnRyZW5kc1ssIHRoZXJtYWxfYmlhcy5zYyA6PSBzY2FsZSh0aGVybWFsX2JpYXMpXQp0cmVuZHNbLCBucHAuc2MgOj0gc2NhbGUobG9nKG5wcCkpXQp0cmVuZHNbLCB2ZWcuc2MgOj0gc2NhbGUobG9nKHZlZysxKSldCnRyZW5kc1ssIGR1cmF0aW9uLnNjIDo9IHNjYWxlKGxvZyhkdXJhdGlvbikpXQp0cmVuZHNbLCBodW1hbl9ib3dsZXIuc2MgOj0gc2NhbGUobG9nKGh1bWFuX2Jvd2xlcisxKSksIGJ5ID0gUkVBTE0yXSAjIHNlcGFyYXRlIHNjYWxpbmcgYnkgcmVhbG0KdHJlbmRzW1JFQUxNMiA9PSAnVGVyckZyZXNoJywgaHVtYW5fZm9vdHByaW50LnNjIDo9IHNjYWxlKGxvZyhodW1hbl92ZW50ZXIrMSkpXQp0cmVuZHNbUkVBTE0yID09ICdNYXJpbmUnLCBodW1hbl9mb290cHJpbnQuc2MgOj0gc2NhbGUobG9nKGh1bWFuX2hhbHBlcm4pKV0KYGBgCgojIyMgRXhhbWluZSBob3cgbWFueSBkYXRhIHBvaW50cyBhcmUgYXZhaWxhYmxlCkp1c3QgdHVybm92ZXIKYGBge3Igc2FtcGxlIHNpemUgYWxsfQpjYXQoJ092ZXJhbGwgIyB0aW1lLXNlcmllczogJywgbnJvdyh0cmVuZHMpLCAnXG4nKQpjYXQoJyMgc3R1ZGllczogJywgdHJlbmRzWywgbGVuZ3RoKHVuaXF1ZShTVFVEWV9JRCkpXSwgJ1xuJykKY2F0KCdEYXRhIHBvaW50czogJywgdHJlbmRzWywgc3VtKG55ckJUKV0sICdcbicpCnRyZW5kc1ssIHRhYmxlKFJFQUxNKV0KdHJlbmRzWywgdGFibGUodGF4YV9tb2QpXQp0cmVuZHNbLCB0YWJsZSh0YXhhX21vZCwgUkVBTE0pXQpgYGAKCldpdGggYWxsIGNvdmFyaWF0ZXMgKEJvd2xlciBmb3IgaHVtYW4pCmBgYHtyIHNhbXBsZSBzaXplIGZvciBKYWNjYXJkIHR1cm5vdmVyfQojIHRoZSBjYXNlcyB3ZSBjYW4gY29tcGFyZQphcHBseSh0cmVuZHNbLCAuKEp0dXRyZW5kcmVtMCwgUkVBTE0sIHRlbXBhdmUuc2MsIHRlbXBhdmVfbWV0YWIuc2MsIHNlYXMuc2MsIG1pY3JvY2xpbS5zYywgdGVtcHRyZW5kLnNjLCBtYXNzLnNjLCBzcGVlZC5zYywgbGlmZXNwYW4uc2MsIGNvbnN1bWVyZnJhYy5zYywgZW5kb3RoZXJtZnJhYy5zYywgbnNwcC5zYywgdGhlcm1hbF9iaWFzLnNjLCBucHAuc2MsIHZlZy5zYywgaHVtYW5fYm93bGVyLnNjKV0sIE1BUkdJTiA9IDIsIEZVTiA9IGZ1bmN0aW9uKHgpIHN1bSghaXMubmEoeCkpKQppIDwtIHRyZW5kc1ssIGNvbXBsZXRlLmNhc2VzKEp0dXRyZW5kcmVtMCwgdGVtcGF2ZS5zYywgdGVtcGF2ZV9tZXRhYi5zYywgc2Vhcy5zYywgbWljcm9jbGltLnNjLCB0ZW1wdHJlbmQuc2MsIG1hc3Muc2MsIHNwZWVkLnNjLCBsaWZlc3Bhbi5zYywgY29uc3VtZXJmcmFjLnNjLCBlbmRvdGhlcm1mcmFjLnNjLCBuc3BwLnNjLCB0aGVybWFsX2JpYXMuc2MsIG5wcC5zYywgdmVnLnNjLCBodW1hbl9ib3dsZXIuc2MpXQpjYXQoJ092ZXJhbGwgIyB0aW1lLXNlcmllczogJywgc3VtKGkpLCAnXG4nKQpjYXQoJyMgc3R1ZGllczogJywgdHJlbmRzW2ksIGxlbmd0aCh1bmlxdWUoU1RVRFlfSUQpKV0sICdcbicpCmNhdCgnRGF0YSBwb2ludHM6ICcsIHRyZW5kc1tpLCBzdW0obnlyQlQpXSwgJ1xuJykKdHJlbmRzW2ksIHRhYmxlKFJFQUxNKV0KdHJlbmRzW2ksIHRhYmxlKHRheGFfbW9kKV0KdHJlbmRzW2ksIHRhYmxlKHRheGFfbW9kLCBSRUFMTSldCmBgYAoKIyMjIENob29zZSB0aGUgdmFyaWFuY2Ugc3RydWN0dXJlIGZvciBtaXhlZCBlZmZlY3RzIG1vZGVscwpUcnkgY29tYmluYXRpb25zIG9mCgotIHZhcmlhbmNlIHNjYWxlZCB0byBhIHBvd2VyIG9mIHRoZSBudW1iZXIgb2YgeWVhcnMgaW4gdGhlIGNvbW11bml0eSB0aW1lLXNlcmllcwotIHZhcmlhbmNlIHNjYWxlZCB0byBhIHBvd2VyIG9mIHRoZSBhYnMgdGVtcGVyYXR1cmUgdHJlbmQKLSByYW5kb20gaW50ZXJjZXB0IGZvciB0YXhhX21vZAotIHJhbmRvbSBpbnRlcmNlcHQgZm9yIFNUVURZX0lECi0gcmFuZG9tIHNsb3BlIChhYnMgdGVtcGVyYXR1cmUgdHJlbmQpIGZvciB0YXhhX21vZAotIHJhbmRvbSBzbG9wZSAoYWJzIHRlbXBlcmF0dXJlIHRyZW5kKSBmb3IgU1RVRFlfSUQKLSByYW5kb20gaW50ZXJjZXB0IGZvciByYXJlZnlJRCAoZm9yIG92ZXJkaXNwZXJzaW9uKQoKQW5kIGNob29zZSB0aGUgb25lIHdpdGggbG93ZXN0IEFJQyAobm90IHJ1bjogdGFrZXMgYSBsb25nIHRpbWUpCmBgYHtyIGNob29zZSB2YXJpYW5jZSBzdHJ1Y3R1cmUgZm9yIEphY2FyZCB0dXJub3ZlciwgZXZhbCA9IEZBTFNFfQojIGZpdCBtb2RlbHMgZm9yIHZhcmlhbmNlIHN0cnVjdHVyZQpmaXhlZCA8LSBmb3JtdWxhKEp0dXRyZW5kcmVtMCB+IHRlbXB0cmVuZF9hYnMuc2MqUkVBTE0gKwogICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKnRzaWduICsgCiAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqdGVtcGF2ZV9tZXRhYi5zYyArIAogICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKnNlYXMuc2MgKyAKICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYyptaWNyb2NsaW0uc2MgKyAKICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYyptYXNzLnNjICsgCiAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2Mqc3BlZWQuc2MgKyAKICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYypjb25zdW1lcmZyYWMuc2MgKwogICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKm5zcHAuc2MgKwogICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKnRoZXJtYWxfYmlhcy5zYzp0c2lnbiArCiAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqbnBwLnNjICsKICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYyp2ZWcuc2MgKwogICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKmR1cmF0aW9uLnNjICsKICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYypodW1hbl9ib3dsZXIuc2M6UkVBTE0yKQppIDwtIHRyZW5kc1ssIGNvbXBsZXRlLmNhc2VzKEp0dXRyZW5kcmVtMCwgdGVtcHRyZW5kX2Ficy5zYywgUkVBTE0sIHRzaWduLCB0ZW1wYXZlX21ldGFiLnNjLCBzZWFzLnNjLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaWNyb2NsaW0uc2MsIG1hc3Muc2MsIHNwZWVkLnNjLCBjb25zdW1lcmZyYWMuc2MsIG5zcHAuc2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlcm1hbF9iaWFzLnNjLCBucHAuc2MsIHZlZy5zYywgaHVtYW5fYm93bGVyLnNjKV0KbW9kcyA8LSB2ZWN0b3IoJ2xpc3QnLCAwKQptb2RzW1sxXV0gPC0gZ2xzKGZpeGVkLCBkYXRhID0gdHJlbmRzW2ksXSkKbW9kc1tbMl1dIDwtIGdscyhmaXhlZCwgZGF0YSA9IHRyZW5kc1tpLF0sIHdlaWdodHMgPSB2YXJQb3dlcigtMC41LCB+bnlyQlQpKQptb2RzW1szXV0gPC0gZ2xzKGZpeGVkLCBkYXRhID0gdHJlbmRzW2ksXSwgd2VpZ2h0cyA9IHZhclBvd2VyKDAuNSwgfnRlbXB0cmVuZF9hYnMuc2MpKQoKbW9kc1tbNF1dIDwtIGxtZShmaXhlZCwgZGF0YSA9IHRyZW5kc1tpLF0sIHJhbmRvbSA9IH4xfHRheGFfbW9kMiwgY29udHJvbCA9IGxtZUNvbnRyb2wob3B0ID0gIm9wdGltIikpCm1vZHNbWzVdXSA8LSBsbWUoZml4ZWQsIGRhdGEgPSB0cmVuZHNbaSxdLCByYW5kb20gPSB+MXxTVFVEWV9JRCwgY29udHJvbCA9IGxtZUNvbnRyb2wob3B0ID0gIm9wdGltIikpCm1vZHNbWzZdXSA8LSBsbWUoZml4ZWQsIGRhdGEgPSB0cmVuZHNbaSxdLCByYW5kb20gPSB+MXx0YXhhX21vZDIvU1RVRFlfSUQsIGNvbnRyb2wgPSBsbWVDb250cm9sKG9wdCA9ICJvcHRpbSIpKQptb2RzW1s3XV0gPC0gbG1lKGZpeGVkLCBkYXRhID0gdHJlbmRzW2ksXSwgcmFuZG9tID0gfjF8U1RVRFlfSUQvcmFyZWZ5SUQsIGNvbnRyb2wgPSBsbWVDb250cm9sKG9wdCA9ICJvcHRpbSIpKQptb2RzW1s4XV0gPC0gbG1lKGZpeGVkLCBkYXRhID0gdHJlbmRzW2ksXSwgcmFuZG9tID0gfjF8dGF4YV9tb2QyL1NUVURZX0lEL3JhcmVmeUlELCBjb250cm9sID0gbG1lQ29udHJvbChvcHQgPSAib3B0aW0iKSkKCm1vZHNbWzldXSA8LSBsbWUoZml4ZWQsIGRhdGEgPSB0cmVuZHNbaSxdLCByYW5kb20gPSB+dGVtcHRyZW5kX2Ficy5zYyB8IHRheGFfbW9kKQptb2RzW1sxMF1dIDwtIGxtZShmaXhlZCwgZGF0YSA9IHRyZW5kc1tpLF0sIHJhbmRvbSA9IGxpc3QoU1RVRFlfSUQgPSB+IHRlbXB0cmVuZF9hYnMuc2MsIHJhcmVmeUlEID0gfjEpKSAjIGluY2x1ZGVzIG92ZXJkaXNwZXJzaW9uLiBuZXcgZm9ybXVsYSBzbyB0aGF0IHJhbmRvbSBzbG9wZSBpcyBvbmx5IGZvciBzdHVkeSBsZXZlbCAobm90IGVub3VnaCBkYXRhIHRvIGV4dGVuZCB0byByYXJlZnlJRCkuCgptb2RzW1sxMV1dIDwtIGxtZShmaXhlZCwgZGF0YSA9IHRyZW5kc1tpLF0sIHJhbmRvbSA9IGxpc3QoU1RVRFlfSUQgPSB+IHRlbXB0cmVuZF9hYnMuc2MsIHJhcmVmeUlEID0gfjEpLCB3ZWlnaHRzID0gdmFyUG93ZXIoLTAuNSwgfm55ckJUKSkKbW9kc1tbMTJdXSA8LSBsbWUoZml4ZWQsIGRhdGEgPSB0cmVuZHNbaSxdLCByYW5kb20gPSBsaXN0KHRheGFfbW9kMiA9IH4gdGVtcHRyZW5kX2Ficy5zYywgU1RVRFlfSUQgPSB+IDEsIHJhcmVmeUlEID0gfjEpLCB3ZWlnaHRzID0gdmFyUG93ZXIoLTAuNSwgfm55ckJUKSkKCmFpY3MgPC0gc2FwcGx5KG1vZHMsIEFJQykKbWluYWljcyA8LSBhaWNzIC0gbWluKGFpY3MpCm1pbmFpY3MKd2hpY2gubWluKGFpY3MpCmBgYApDaG9vc2VzIHRoZSByYW5kb20gc2xvcGVzICh0ZW1wdHJlbmRfYWJzKSAmIGludGVyY2VwdHMgZm9yIFNUVURZX0lELCBvdmVyZGlzcGVyc2lvbiwgYW5kIHZhcmlhbmNlIHNjYWxlZCB0byBudW1iZXIgb2YgeWVhcnMuCldlIGhhdmVuJ3QgZGVhbHQgd2l0aCBwb3RlbnRpYWwgdGVzdGluZyBvbiB0aGUgYm91bmRhcnkgaXNzdWVzIGhlcmUgeWV0LgoKIyBSZXN1bHRzCiMjIFdoZXJlIGRvIHdlIGhhdmUgZGF0YT8KYGBge3IgbWFwfQp3b3JsZCA8LSBtYXBfZGF0YSgnd29ybGQnKQpnZ3Bsb3Qod29ybGQsIGFlcyh4ID0gbG9uZywgeSA9IGxhdCwgZ3JvdXAgPSBncm91cCkpICsKICAgIGdlb21fcG9seWdvbihmaWxsID0gJ2xpZ2h0Z3JheScsIGNvbG9yID0gJ3doaXRlJykgKwogICAgZ2VvbV9wb2ludChkYXRhID0gdHJlbmRzLCBhZXMocmFyZWZ5SURfeCwgcmFyZWZ5SURfeSwgZ3JvdXAgPSBSRUFMTSwgY29sb3IgPSBSRUFMTSksIHNpemUgPSAwLjUsIGFscGhhID0gMC40KSAgKwogICAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGU9IlNldDEiLCBuYW1lID0gJ1JlYWxtJykgKwogIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICJibGFjayIpLAogICAgICAgIGxlZ2VuZC5rZXk9ZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGV4dD1lbGVtZW50X3RleHQoc2l6ZT0xNiksCiAgICAgICAgYXhpcy50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0yMCkpICsKICBsYWJzKHggPSAnTG9uZ2l0dWRlICjCsCknLCB5ID0gJ0xhdGl0dWRlICjCsCknKQpgYGAKCk1vc3RseSBub3J0aGVybiBoZW1pc3BoZXJlLCBidXQgc3ByZWFkIGFsbCBvdmVyLiBOb3Qgc28gbXVjaCBpbiBBZnJpY2Egb3IgbXVjaCBvZiBBc2lhLgoKCgoKIyNBdmVyYWdlIHJhdGVzIG9mIHR1cm5vdmVyICh3aXRob3V0IHllYXIgMSkKYGBge3IgcmF0ZXMgb2YgdHVybm92ZXIgcmVtMH0KdHJlbmRzW2Ficyh0ZW1wdHJlbmQpID49IDAuNSwgdGVtcHRyZW5kdGV4dDEgOj0gJ0NoYW5naW5nID49MC41J10KdHJlbmRzW2Ficyh0ZW1wdHJlbmQpIDw9IDAuMDUsIHRlbXB0cmVuZHRleHQxIDo9ICdTdGFibGUgPD0wLjA1J10KdHJlbmRzW3RlbXB0cmVuZCA8PSAtMC41LCB0ZW1wdHJlbmR0ZXh0MiA6PSAnQ29vbGluZyA8PSAtMC41J10KdHJlbmRzW3RlbXB0cmVuZCA+PSAwLjUsIHRlbXB0cmVuZHRleHQyIDo9ICdXYXJtaW5nID49IDAuNSddCnRyZW5kc1thYnModGVtcHRyZW5kKSA+PSAwLjUgJiBhYnModGVtcHRyZW5kKSA8IDEsIHRlbXB0cmVuZHRleHQzIDo9ICdTbG93IENoYW5naW5nID49MC41ICYgPDEnXQp0cmVuZHNbYWJzKHRlbXB0cmVuZCkgPj0gMSwgdGVtcHRyZW5kdGV4dDMgOj0gJ0Zhc3QgQ2hhbmdpbmcgPj0xJ10KCnRyZW5kc3VtMSA8LSB0cmVuZHNbIWlzLm5hKHRlbXB0cmVuZHRleHQxKSwgCiAgICAgICAgICAgICAgICAgICAgLih0eXBlID0gJ0p0dScsIAogICAgICAgICAgICAgICAgICAgICAgYXZlID0gbWVhbihKdHV0cmVuZHJlbTAsIG5hLnJtPVRSVUUpLCAKICAgICAgICAgICAgICAgICAgICAgIHNlID0gc2QoSnR1dHJlbmRyZW0wLCBuYS5ybT1UUlVFKS9zcXJ0KC5OKSwKICAgICAgICAgICAgICAgICAgICAgIG4gPSBzdW0oIWlzLm5hKEp0dXRyZW5kcmVtMCkpKSwKICAgICAgICAgICAgICAgICAgICBieSA9IC4odGV4dCA9IHRlbXB0cmVuZHRleHQxKV0gIyB0dXJub3ZlciBwZXIgeWVhciBmb3IgbG9jYXRpb25zIGNoYW5naW5nIHRlbXBlcmF0dXJlCnRyZW5kc3VtMSA8LSByYmluZCh0cmVuZHN1bTEsIHRyZW5kc1shaXMubmEodGVtcHRyZW5kdGV4dDEpLCAKICAgICAgICAgICAgICAgICAgICAuKHR5cGUgPSAnSmJldGEnLCAKICAgICAgICAgICAgICAgICAgICAgIGF2ZSA9IG1lYW4oSmJldGF0cmVuZHJlbTAsIG5hLnJtPVRSVUUpLCAKICAgICAgICAgICAgICAgICAgICAgIHNlID0gc2QoSmJldGF0cmVuZHJlbTAsIG5hLnJtPVRSVUUpL3NxcnQoLk4pLAogICAgICAgICAgICAgICAgICAgICAgbiA9IHN1bSghaXMubmEoSmJldGF0cmVuZHJlbTApKSksCiAgICAgICAgICAgICAgICAgICAgYnkgPSAuKHRleHQgPSB0ZW1wdHJlbmR0ZXh0MSldKQp0cmVuZHN1bTEgPC0gcmJpbmQodHJlbmRzdW0xLCB0cmVuZHNbIWlzLm5hKHRlbXB0cmVuZHRleHQxKSwgCiAgICAgICAgICAgICAgICAgICAgLih0eXBlID0gJ0hvcm4nLCAKICAgICAgICAgICAgICAgICAgICAgIGF2ZSA9IG1lYW4oSG9ybnRyZW5kcmVtMCwgbmEucm09VFJVRSksIAogICAgICAgICAgICAgICAgICAgICAgc2UgPSBzZChIb3JudHJlbmRyZW0wLCBuYS5ybT1UUlVFKS9zcXJ0KC5OKSwKICAgICAgICAgICAgICAgICAgICAgIG4gPSBzdW0oIWlzLm5hKEhvcm50cmVuZHJlbTApKSksCiAgICAgICAgICAgICAgICAgICAgYnkgPSAuKHRleHQgPSB0ZW1wdHJlbmR0ZXh0MSldKQoKdHJlbmRzdW0yIDwtIHRyZW5kc1shaXMubmEodGVtcHRyZW5kdGV4dDIpLCAKICAgICAgICAgICAgICAgICAgICAuKHR5cGUgPSAnSnR1JywgCiAgICAgICAgICAgICAgICAgICAgICBhdmUgPSBtZWFuKEp0dXRyZW5kcmVtMCwgbmEucm09VFJVRSksIAogICAgICAgICAgICAgICAgICAgICAgc2UgPSBzZChKdHV0cmVuZHJlbTAsIG5hLnJtPVRSVUUpL3NxcnQoLk4pLAogICAgICAgICAgICAgICAgICAgICAgbiA9IHN1bSghaXMubmEoSnR1dHJlbmRyZW0wKSkpLAogICAgICAgICAgICAgICAgICAgIGJ5ID0gLih0ZXh0ID0gdGVtcHRyZW5kdGV4dDIpXSAjIGluYy4gZGlyZWN0aW9uCnRyZW5kc3VtMiA8LSByYmluZCh0cmVuZHN1bTIsIHRyZW5kc1shaXMubmEodGVtcHRyZW5kdGV4dDIpLCAKICAgICAgICAgICAgICAgICAgICAuKHR5cGUgPSAnSmJldGEnLCAKICAgICAgICAgICAgICAgICAgICAgIGF2ZSA9IG1lYW4oSmJldGF0cmVuZHJlbTAsIG5hLnJtPVRSVUUpLCAKICAgICAgICAgICAgICAgICAgICAgIHNlID0gc2QoSmJldGF0cmVuZHJlbTAsIG5hLnJtPVRSVUUpL3NxcnQoLk4pLAogICAgICAgICAgICAgICAgICAgICAgbiA9IHN1bSghaXMubmEoSmJldGF0cmVuZHJlbTApKSksCiAgICAgICAgICAgICAgICAgICAgYnkgPSAuKHRleHQgPSB0ZW1wdHJlbmR0ZXh0MildKQp0cmVuZHN1bTIgPC0gcmJpbmQodHJlbmRzdW0yLCB0cmVuZHNbIWlzLm5hKHRlbXB0cmVuZHRleHQyKSwgCiAgICAgICAgICAgICAgICAgICAgLih0eXBlID0gJ0hvcm4nLCAKICAgICAgICAgICAgICAgICAgICAgIGF2ZSA9IG1lYW4oSG9ybnRyZW5kcmVtMCwgbmEucm09VFJVRSksIAogICAgICAgICAgICAgICAgICAgICAgc2UgPSBzZChIb3JudHJlbmRyZW0wLCBuYS5ybT1UUlVFKS9zcXJ0KC5OKSwKICAgICAgICAgICAgICAgICAgICAgIG4gPSBzdW0oIWlzLm5hKEhvcm50cmVuZHJlbTApKSksCiAgICAgICAgICAgICAgICAgICAgYnkgPSAuKHRleHQgPSB0ZW1wdHJlbmR0ZXh0MildKQoKdHJlbmRzdW0zIDwtIHRyZW5kc1shaXMubmEodGVtcHRyZW5kdGV4dDMpLCAKICAgICAgICAgICAgICAgICAgICAuKHR5cGUgPSAnSnR1JywgCiAgICAgICAgICAgICAgICAgICAgICBhdmUgPSBtZWFuKEp0dXRyZW5kcmVtMCwgbmEucm09VFJVRSksIAogICAgICAgICAgICAgICAgICAgICAgc2UgPSBzZChKdHV0cmVuZHJlbTAsIG5hLnJtPVRSVUUpL3NxcnQoLk4pLAogICAgICAgICAgICAgICAgICAgICAgbiA9IHN1bSghaXMubmEoSnR1dHJlbmRyZW0wKSkpLAogICAgICAgICAgICAgICAgICAgIGJ5ID0gLih0ZXh0ID0gdGVtcHRyZW5kdGV4dDMpXSAjIGluYy4gcmF0ZQp0cmVuZHN1bTMgPC0gcmJpbmQodHJlbmRzdW0zLCB0cmVuZHNbIWlzLm5hKHRlbXB0cmVuZHRleHQzKSwgCiAgICAgICAgICAgICAgICAgICAgLih0eXBlID0gJ0piZXRhJywgCiAgICAgICAgICAgICAgICAgICAgICBhdmUgPSBtZWFuKEpiZXRhdHJlbmRyZW0wLCBuYS5ybT1UUlVFKSwgCiAgICAgICAgICAgICAgICAgICAgICBzZSA9IHNkKEpiZXRhdHJlbmRyZW0wLCBuYS5ybT1UUlVFKS9zcXJ0KC5OKSwKICAgICAgICAgICAgICAgICAgICAgIG4gPSBzdW0oIWlzLm5hKEpiZXRhdHJlbmRyZW0wKSkpLAogICAgICAgICAgICAgICAgICAgIGJ5ID0gLih0ZXh0ID0gdGVtcHRyZW5kdGV4dDMpXSkKdHJlbmRzdW0zIDwtIHJiaW5kKHRyZW5kc3VtMywgdHJlbmRzWyFpcy5uYSh0ZW1wdHJlbmR0ZXh0MyksIAogICAgICAgICAgICAgICAgICAgIC4odHlwZSA9ICdIb3JuJywgCiAgICAgICAgICAgICAgICAgICAgICBhdmUgPSBtZWFuKEhvcm50cmVuZHJlbTAsIG5hLnJtPVRSVUUpLCAKICAgICAgICAgICAgICAgICAgICAgIHNlID0gc2QoSG9ybnRyZW5kcmVtMCwgbmEucm09VFJVRSkvc3FydCguTiksCiAgICAgICAgICAgICAgICAgICAgICBuID0gc3VtKCFpcy5uYShIb3JudHJlbmRyZW0wKSkpLAogICAgICAgICAgICAgICAgICAgIGJ5ID0gLih0ZXh0ID0gdGVtcHRyZW5kdGV4dDMpXSkKCnRyZW5kc3VtNCA8LSByYmluZCh0cmVuZHN1bTEsIHRyZW5kc3VtMiwgdHJlbmRzdW0zKQpzZXRvcmRlcih0cmVuZHN1bTQsIHR5cGUsIHRleHQpCgp3cml0ZS5jc3YodHJlbmRzdW00LCBmaWxlID0gJ291dHB1dC90cmVuZHN1bW1hcnkuY3N2Jywgcm93Lm5hbWVzID0gRkFMU0UpCgp0cmVuZHN1bTQKYGBgCgojIyMgUGxvdHMgb2YgdHVybm92ZXIgcmF0ZXMKYGBge3IgdHVybm92ZXIgdnMuIHRlbXBlcmF0dXJlIHZpb2xpbiBwbG90fQpwMSA8LSBnZ3Bsb3QodHJlbmRzWyFpcy5uYSh0ZXh0KSwgXSwgYWVzKHRlbXB0cmVuZHRleHQxLCBIb3JudHJlbmRyZW0wKSkgKwogIGdlb21fdmlvbGluKGRyYXdfcXVhbnRpbGVzID0gYygwLjI1LCAwLjUsIDAuNzUpLCBmaWxsID0gJ2dyZXknKSArCiAgbGFicyh4ID0gJycsIHkgPSAnVHVybm92ZXInLCB0YWcgPSAnQScsIHRpdGxlID0gJ1JhdGUgb2YgdGVtcGVyYXR1cmUgY2hhbmdlJykgKwogIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICJibGFjayIpLAogICAgICAgIGxlZ2VuZC5rZXk9ZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGV4dD1lbGVtZW50X3RleHQoc2l6ZT04KSwKICAgICAgICBheGlzLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTEwKSkgKwogIGdlb21fYWJsaW5lKGludGVyY2VwdCA9IDAsIHNsb3BlID0gMCkKCnAyIDwtIGdncGxvdCh0cmVuZHNbIWlzLm5hKHRleHQpLCBdLCBhZXModGVtcHRyZW5kdGV4dDIsIEhvcm50cmVuZHJlbTApKSArCiAgZ2VvbV92aW9saW4oZHJhd19xdWFudGlsZXMgPSBjKDAuMjUsIDAuNSwgMC43NSksIGZpbGwgPSAnZ3JleScpICsKICBsYWJzKHggPSAnJywgeSA9ICdUdXJub3ZlcicsIHRhZyA9ICdBJywgdGl0bGUgPSAnUmF0ZSBvZiB0ZW1wZXJhdHVyZSBjaGFuZ2UnKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLCBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImJsYWNrIiksCiAgICAgICAgbGVnZW5kLmtleT1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0PWVsZW1lbnRfdGV4dChzaXplPTgpLAogICAgICAgIGF4aXMudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTApKSArCiAgZ2VvbV9hYmxpbmUoaW50ZXJjZXB0ID0gMCwgc2xvcGUgPSAwKQoKcDMgPC0gZ2dwbG90KHRyZW5kc3VtNCwgYWVzKHRleHQsIGF2ZSwgZ3JvdXAgPSB0eXBlLCBjb2xvciA9IHR5cGUpKSArCiAgZ2VvbV9wb2ludChwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC4yNSksIHNpemUgPSAwLjUpICsKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPWF2ZS1zZSwgeW1heD1hdmUrc2UpLCB3aWR0aD0uMSwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuMjUpKSArCiAgbGFicyh4ID0gJycsIHkgPSAnU2xvcGUgb2YgdGVtcG9yYWwgdHVybm92ZXInKSArCiAgZ2VvbV9hYmxpbmUoaW50ZXJjZXB0ID0gMCwgc2xvcGUgPSAwLCBsaW5ldHlwZSA9ICdkYXNoZWQnKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLCBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImJsYWNrIiksCiAgICAgICAgbGVnZW5kLmtleT1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0PWVsZW1lbnRfdGV4dChzaXplPTgpLAogICAgICAgIGF4aXMudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTApLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIHZqdXN0ID0gMC43KSkgKwogIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygtMC4wMSwwLjA4KSkKCgpncmlkLmFycmFuZ2UocDEsIHAyLCBwMywgbmNvbCA9IDIsIAogICAgICAgICAgICAgbGF5b3V0X21hdHJpeCA9IHJiaW5kKGMoMSwyKSwgYygzLDMpKSwKICAgICAgICAgICAgIGhlaWdodHM9Yyh1bml0KDAuNCwgIm5wYyIpLCB1bml0KDAuNiwgIm5wYyIpKSkKYGBgCgojIyBUZW1wZXJhdHVyZS1vbmx5IG1vZGVsIChKdHV0cmVuZCwgSmJldGF0cmVuZCwgSG9ybnRyZW5kKQpgYGB7ciBMTUUgdGVtcGVyYXR1cmUgb25seSByZW0wfQppNCA8LSB0cmVuZHNbLCBjb21wbGV0ZS5jYXNlcyhKdHV0cmVuZHJlbTAsIFJFQUxNLCB0ZW1wdHJlbmQpXQoKcmFuZGVmIDwtIGxpc3QoU1RVRFlfSUQgPSB+IGFicyh0ZW1wdHJlbmQpLCByYXJlZnlJRCA9IH4xKQp2YXJlZiA8LSB2YXJQb3dlcigtMC41LCB+bnlyQlQpCgppZihmaWxlLmV4aXN0cygndGVtcC9tb2Rvbmx5VHRyZW5kcmVtMC5yZHMnKSl7CiAgbW9kb25seVR0cmVuZHJlbTAgPC0gcmVhZFJEUygndGVtcC9tb2Rvbmx5VHRyZW5kcmVtMC5yZHMnKQp9IGVsc2UgewogIG1vZG9ubHlUdHJlbmRyZW0wIDwtIGxtZShKdHV0cmVuZHJlbTAgfiBhYnModGVtcHRyZW5kKSpSRUFMTSwKICAgICAgICAgICAgICAgICAgIHJhbmRvbSA9IHJhbmRlZiwgd2VpZ2h0cyA9IHZhcmVmLCBkYXRhID0gdHJlbmRzW2k0LF0sIG1ldGhvZCA9ICdSRU1MJykKICBzYXZlUkRTKG1vZG9ubHlUdHJlbmRyZW0wLCBmaWxlID0gJ3RlbXAvbW9kb25seVR0cmVuZHJlbTAucmRzJykKfQoKaTUgPC0gdHJlbmRzWywgY29tcGxldGUuY2FzZXMoSmJldGF0cmVuZHJlbTAsIFJFQUxNLCB0ZW1wdHJlbmQpXQppZihmaWxlLmV4aXN0cygndGVtcC9tb2Rvbmx5VHRyZW5kSmJldGFyZW0wLnJkcycpKXsKICBtb2Rvbmx5VHRyZW5kSmJldGFyZW0wIDwtIHJlYWRSRFMoJ3RlbXAvbW9kb25seVR0cmVuZEpiZXRhcmVtMC5yZHMnKQp9IGVsc2UgewogIG1vZG9ubHlUdHJlbmRKYmV0YXJlbTAgPC0gbG1lKEpiZXRhdHJlbmRyZW0wIH4gYWJzKHRlbXB0cmVuZCkqUkVBTE0sCiAgICAgICAgICAgICAgICAgICByYW5kb20gPSByYW5kZWYsIHdlaWdodHMgPSB2YXJlZiwgZGF0YSA9IHRyZW5kc1tpNSxdLCBtZXRob2QgPSAnUkVNTCcsIAogICAgICAgICAgICAgICAgICAgY29udHJvbD1sbWVDb250cm9sKG1zTWF4SXRlciA9IDEwMCwgbWF4SXRlciA9IDEwMCkpCiAgc2F2ZVJEUyhtb2Rvbmx5VHRyZW5kSmJldGFyZW0wLCBmaWxlID0gJ3RlbXAvbW9kb25seVR0cmVuZEpiZXRhcmVtMC5yZHMnKQp9CgppNiA8LSB0cmVuZHNbLCBjb21wbGV0ZS5jYXNlcyhIb3JudHJlbmRyZW0wLCBSRUFMTSwgdGVtcHRyZW5kKV0KaWYoZmlsZS5leGlzdHMoJ3RlbXAvbW9kb25seVR0cmVuZEhvcm5yZW0wLnJkcycpKXsKICBtb2Rvbmx5VHRyZW5kSG9ybnJlbTAgPC0gcmVhZFJEUygndGVtcC9tb2Rvbmx5VHRyZW5kSG9ybnJlbTAucmRzJykKfSBlbHNlIHsKICBtb2Rvbmx5VHRyZW5kSG9ybnJlbTAgPC0gbG1lKEhvcm50cmVuZHJlbTAgfiBhYnModGVtcHRyZW5kKSpSRUFMTSwKICAgICAgICAgICAgICAgICAgIHJhbmRvbSA9IHJhbmRlZiwgd2VpZ2h0cyA9IHZhcmVmLCBkYXRhID0gdHJlbmRzW2k2LF0sIG1ldGhvZCA9ICdSRU1MJykKICBzYXZlUkRTKG1vZG9ubHlUdHJlbmRIb3JucmVtMCwgZmlsZSA9ICd0ZW1wL21vZG9ubHlUdHJlbmRIb3JucmVtMC5yZHMnKQp9CgpzdW1tYXJ5KG1vZG9ubHlUdHJlbmRyZW0wKQpzdW1tYXJ5KG1vZG9ubHlUdHJlbmRKYmV0YXJlbTApCnN1bW1hcnkobW9kb25seVR0cmVuZEhvcm5yZW0wKQoKCmBgYAoKCiMjIyBQbG90IHRoZSB0ZW1wLW9ubHkgY29lZmZpY2llbnRzCmBgYHtyIG1vZG9ubHlUdHJlbmRzaW1wIGNvZWZzfQpjb2xvcnMgPC0gYnJld2VyLnBhbCgzLCAnRGFyazInKQoKIyBtYWtlIHRhYmxlIG9mIGNvZWZmaWNpZW50cwpjb2VmczEgPC0gYXMuZGF0YS5mcmFtZShzdW1tYXJ5KG1vZG9ubHlUdHJlbmRyZW0wKSR0VGFibGUpCmNvZWZzMiA8LSBhcy5kYXRhLmZyYW1lKHN1bW1hcnkobW9kb25seVR0cmVuZEpiZXRhcmVtMCkkdFRhYmxlKQpjb2VmczMgPC0gYXMuZGF0YS5mcmFtZShzdW1tYXJ5KG1vZG9ubHlUdHJlbmRIb3JucmVtMCkkdFRhYmxlKQpjb2VmczEkbW9kIDwtICdKdHUnCmNvZWZzMiRtb2QgPC0gJ0piZXRhJwpjb2VmczMkbW9kIDwtICdIb3JuJwpyb3dzMSA8LSB3aGljaChncmVwbCgndGVtcHRyZW5kJywgcm93bmFtZXMoY29lZnMxKSkpICMgZXh0cmFjdCB0ZW1wZXJhdHVyZSBlZmZlY3QKY29scyA8LSBjKCdWYWx1ZScsICdTdGQuRXJyb3InLCAnbW9kJykKYWxsY29lZnMgPC0gcmJpbmQoY29lZnMxW3Jvd3MxLCBjb2xzXSwgY29lZnMyW3Jvd3MxLCBjb2xzXSwgY29lZnMzW3Jvd3MxLCBjb2xzXSkKYWxsY29lZnMkVmFsdWVbZ3JlcGwoJ1JFQUxNTWFyaW5lJywgcm93bmFtZXMoYWxsY29lZnMpKV0gPC0gCiAgYWxsY29lZnMkVmFsdWVbZ3JlcGwoJ1JFQUxNTWFyaW5lJywgcm93bmFtZXMoYWxsY29lZnMpKV0gKyAKICBhbGxjb2VmcyRWYWx1ZVshZ3JlcGwoJ1JFQUxNJywgcm93bmFtZXMoYWxsY29lZnMpKV0gIyBhZGQgaW50ZXJjZXB0IHRvIG1hcmluZSBlZmZlY3RzCmFsbGNvZWZzJFZhbHVlW2dyZXBsKCdSRUFMTVRlcnJlc3RyaWFsJywgcm93bmFtZXMoYWxsY29lZnMpKV0gPC0gCiAgYWxsY29lZnMkVmFsdWVbZ3JlcGwoJ1JFQUxNVGVycmVzdHJpYWwnLCByb3duYW1lcyhhbGxjb2VmcykpXSArIAogIGFsbGNvZWZzJFZhbHVlWyFncmVwbCgnUkVBTE0nLCByb3duYW1lcyhhbGxjb2VmcykpXSAjIGFkZCBpbnRlcmNlcHQgdG8gdGVycmVzdHJpYWwgZWZmZWN0cwoKYWxsY29lZnMkbENJIDwtIGFsbGNvZWZzJFZhbHVlIC0gYWxsY29lZnMkU3RkLkVycm9yICMgbG93ZXIgY29uZmlkZW5jZSBpbnRlcnZhbAphbGxjb2VmcyR1Q0kgPC0gYWxsY29lZnMkVmFsdWUgKyBhbGxjb2VmcyRTdGQuRXJyb3IKYWxsY29lZnMkeSA8LSBjKDMsIDIsIDEpICsgcmVwKGMoMCwgLTAuMSwgLTAuMiksIGMoMywgMywgMykpICMgeS12YWx1ZXMKYWxsY29lZnMkY29sIDwtIGMocmVwKGNvbG9yc1sxXSwgMyksIHJlcChjb2xvcnNbMl0sIDMpLCByZXAoY29sb3JzWzNdLCAzKSkKYWxsY29lZnMkcmVhbG0gPC0gcmVwKGMoJ0ZyZXNod2F0ZXInLCAnTWFyaW5lJywgJ1RlcnJlc3RyaWFsJyksIDMpCgpwYXIobGFzID0gMSwgbWFpID0gYygwLjgsIDIsIDAuMSwgMC4xKSkKcGxvdCgwLDAsIGNvbCA9ICd3aGl0ZScsIHhsaW09YygtMC4xLCAwLjg1KSwgeWxpbSA9IGMoMC41LDMpLCAKICAgICB5YXh0PSduJywgeGxhYiA9ICdUdXJub3ZlciBwZXIgfMKwQy95cnwnLCB5bGFiID0nJykKYXhpcygyLCBhdCA9IDM6MSwgbGFiZWxzID0gYygnRnJlc2h3YXRlcicsICdNYXJpbmUnLCAnVGVycmVzdHJpYWwnKSwgY2V4LmF4aXMgPSAwLjcpCmFibGluZSh2ID0gMCwgY29sID0gJ2dyZXknKQpmb3IoaSBpbiAxOm5yb3coYWxsY29lZnMpKXsKICB3aXRoKGFsbGNvZWZzW2ksIF0sIHBvaW50cyhWYWx1ZSwgeSwgcGNoID0gMTYsIGNvbCA9IGNvbCkpCiAgd2l0aChhbGxjb2Vmc1tpLCBdLCBsaW5lcyh4ID0gYyhsQ0ksIHVDSSksIHkgPSBjKHksIHkpLCBjb2wgPSBjb2wpKQp9CmxlZ2VuZCgnYm90dG9tcmlnaHQnLCBjb2wgPSBjb2xvcnMsIGx3ZCA9IDEsIHBjaCA9IDE2LCAKICAgICAgIGxlZ2VuZCA9IGMoJ0phY2NhcmQgdHVybm92ZXInLCAnSmFjY2FyZCB0b3RhbCcsICdIb3JuLU1vcmlzaXRhJywKICAgICAgICAgICAgICAgICAgJ0phY2NhcmQgdHVybm92ZXIgcmVtMCcsICdKYWNjYXJkIHRvdGFsIHJlbTAnLCAnSG9ybi1Nb3Jpc2l0YSByZW0wJykpCgpgYGAKCiMjIEZ1bGwgbW9kZWxzClRyeSBzdGF0aWMgY292YXJpYXRlcyBwbHVzIGludGVyYWN0aW9ucyBvZiBhYnMgdGVtcGVyYXR1cmUgdHJlbmQgd2l0aCBlYWNoIGNvdmFyaWF0ZToKCi0gcmVhbG0KLSBzcGVlZAotIG1hc3MKLSBhdmVyYWdlIG1ldGFib2xpYyB0ZW1wZXJhdHVyZQotIGNvbnN1bWVyIGZyYWN0aW9uCi0gZW52aXJvbm1lbnRhbCB0ZW1wZXJhdHVyZQotIHNlYXNvbmFsaXR5Ci0gbWljcm9jbGltYXRlcwotIHRoZXJtYWwgYmlhcwotIE5QUAotIHZlZ2V0YXRpb24KLSBkdXJhdGlvbgotIGh1bWFuIGZvb3RwcmludAoKRXhjZXB0IGZvciB0aGVybWFsIGJpYXM6IGludGVyYWN0IHdpdGggdGVtcGVyYXR1cmUgdHJlbmQgKG5vdCBhYnMpCgojIyMgRml0L2xvYWQgZnVsbCBtb2RlbHMKIyMjIyBCb3dsZXIgdnMgVmVudGVyL0hhbHBlcm4gaHVtYW4gaW1wYWN0CkJvd2xlciBoYXMgbG93ZXIgQUlDLgpgYGB7ciBMTUUgSmFjYXJkIHR1cm5vdmVyIHRlbXBlcmF0dXJlIGZ1bGwgcmVtMH0KIyB1c2luZyBCb3dsZXIgZm9yIGh1bWFuIGltcGFjdAppMSA8LSB0cmVuZHNbLCBjb21wbGV0ZS5jYXNlcyhKdHV0cmVuZHJlbTAsIFJFQUxNLCB0ZW1wYXZlX21ldGFiLnNjLCBzZWFzLnNjLCBtaWNyb2NsaW0uc2MsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MsIG1hc3Muc2MsIHNwZWVkLnNjLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdW1lcmZyYWMuc2MsIG5zcHAuc2MsIHRoZXJtYWxfYmlhcy5zYywgbnBwLnNjLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWcuc2MsIGR1cmF0aW9uLnNjLCBodW1hbl9ib3dsZXIuc2MsIGh1bWFuX2Zvb3RwcmludC5zYyldCgpyYW5kZWYgPC0gbGlzdChTVFVEWV9JRCA9IH4gdGVtcHRyZW5kX2Ficy5zYywgcmFyZWZ5SUQgPSB+MSkKdmFyZWYgPC0gdmFyUG93ZXIoLTAuNSwgfm55ckJUKQoKaWYoZmlsZS5leGlzdHMoJ3RlbXAvbW9kVGZ1bGxib3dsZXJyZW0wLnJkcycpKXsKICBtb2RUZnVsbGJvd2xlcnJlbTAgPC0gcmVhZFJEUygndGVtcC9tb2RUZnVsbGJvd2xlcnJlbTAucmRzJykKfSBlbHNlIHsKCm1vZFRmdWxsYm93bGVycmVtMCA8LSBsbWUoSnR1dHJlbmRyZW0wIH4gdGVtcHRyZW5kX2Ficy5zYypSRUFMTSArCiAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqdHNpZ24gKyAKICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYyp0ZW1wYXZlX21ldGFiLnNjICsgCiAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2Mqc2Vhcy5zYyArIAogICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKm1pY3JvY2xpbS5zYyArIAogICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKm1hc3Muc2MgKyAKICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYypzcGVlZC5zYyArIAogICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKmNvbnN1bWVyZnJhYy5zYyArCiAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqbnNwcC5zYyArCiAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqdGhlcm1hbF9iaWFzLnNjOnRzaWduICsKICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYypucHAuc2MgKwogICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKnZlZy5zYyArCiAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqZHVyYXRpb24uc2MgKwogICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKmh1bWFuX2Jvd2xlci5zYzpSRUFMTTIsCiAgICAgICAgICAgICAgICAgICByYW5kb20gPSByYW5kZWYsIHdlaWdodHMgPSB2YXJlZiwgZGF0YSA9IHRyZW5kc1tpMSxdLCBtZXRob2QgPSAnUkVNTCcpCiAgc2F2ZVJEUyhtb2RUZnVsbGJvd2xlcnJlbTAsIGZpbGUgPSAndGVtcC9tb2RUZnVsbGJvd2xlcnJlbTAucmRzJykKfQoKIyB1c2luZyBWZW50ZXIvSGFscGVybiBmb3IgaHVtYW4gaW1wYWN0CmlmKGZpbGUuZXhpc3RzKCd0ZW1wL21vZFRmdWxsZm9vdHByaW50cmVtMC5yZHMnKSl7CiAgbW9kVGZ1bGxmb290cHJpbnRyZW0wIDwtIHJlYWRSRFMoJ3RlbXAvbW9kVGZ1bGxmb290cHJpbnRyZW0wLnJkcycpCn0gZWxzZSB7Cm1vZFRmdWxsZm9vdHByaW50cmVtMCA8LSBsbWUoSnR1dHJlbmRyZW0wIH4gdGVtcHRyZW5kX2Ficy5zYypSRUFMTSArIAogICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKnRzaWduICsgCiAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqdGVtcGF2ZV9tZXRhYi5zYyArIAogICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKnNlYXMuc2MgKyAKICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYyptaWNyb2NsaW0uc2MgKyAKICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYyptYXNzLnNjICsgCiAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2Mqc3BlZWQuc2MgKyAKICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYypjb25zdW1lcmZyYWMuc2MgKwogICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKm5zcHAuc2MgKwogICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKnRoZXJtYWxfYmlhcy5zYzp0c2lnbiArCiAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqbnBwLnNjICsKICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYyp2ZWcuc2MgKwogICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKmR1cmF0aW9uLnNjICsKICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYypodW1hbl9mb290cHJpbnQuc2M6UkVBTE0yLAogICAgICAgICAgICAgICAgICAgcmFuZG9tID0gcmFuZGVmLCB3ZWlnaHRzID0gdmFyZWYsIGRhdGEgPSB0cmVuZHNbaTEsXSwgbWV0aG9kID0gJ1JFTUwnLAogICAgICAgICAgICAgICAgICAgY29udHJvbCA9IGxtZUNvbnRyb2wobWF4SXRlciA9IDEwMCwgbXNNYXhJdGVyID0gMTAwLCBuaXRlckVNID0gNTAsIG1zTWF4RXZhbCA9IDUwMCkpCiAgc2F2ZVJEUyhtb2RUZnVsbGZvb3RwcmludHJlbTAsIGZpbGUgPSAndGVtcC9tb2RUZnVsbGZvb3RwcmludHJlbTAucmRzJykKCn0KQUlDKG1vZFRmdWxsYm93bGVycmVtMCwgbW9kVGZ1bGxmb290cHJpbnRyZW0wKQoKYGBgCgojIyMjIEZ1bGwgbW9kZWxzCmBgYHtyIExNRSBKYWNhcmQgdG90YWwgYW5kIE1IIG1vZGVscyByZW0wLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9OH0KaTEgPC0gdHJlbmRzWywgY29tcGxldGUuY2FzZXMoSnR1dHJlbmRyZW0wLCBSRUFMTSwgdGVtcGF2ZV9tZXRhYi5zYywgc2Vhcy5zYywgbWljcm9jbGltLnNjLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjLCBtYXNzLnNjLCBzcGVlZC5zYywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3VtZXJmcmFjLnNjLCBuc3BwLnNjLCB0aGVybWFsX2JpYXMuc2MsIG5wcC5zYywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVnLnNjLCBkdXJhdGlvbi5zYywgaHVtYW5fYm93bGVyLnNjKV0KaTIgPC0gdHJlbmRzWywgY29tcGxldGUuY2FzZXMoSmJldGF0cmVuZHJlbTAsIFJFQUxNLCB0ZW1wYXZlX21ldGFiLnNjLCBzZWFzLnNjLCBtaWNyb2NsaW0uc2MsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MsIG1hc3Muc2MsIHNwZWVkLnNjLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdW1lcmZyYWMuc2MsIG5zcHAuc2MsIHRoZXJtYWxfYmlhcy5zYywgbnBwLnNjLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWcuc2MsIGR1cmF0aW9uLnNjLCBodW1hbl9ib3dsZXIuc2MpXQppMyA8LSB0cmVuZHNbLCBjb21wbGV0ZS5jYXNlcyhIb3JudHJlbmRyZW0wLCBSRUFMTSwgdGVtcGF2ZV9tZXRhYi5zYywgc2Vhcy5zYywgbWljcm9jbGltLnNjLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjLCBtYXNzLnNjLCBzcGVlZC5zYywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3VtZXJmcmFjLnNjLCBuc3BwLnNjLCB0aGVybWFsX2JpYXMuc2MsIG5wcC5zYywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVnLnNjLCBkdXJhdGlvbi5zYywgaHVtYW5fYm93bGVyLnNjKV0KCnJhbmRlZiA8LSBsaXN0KFNUVURZX0lEID0gfiB0ZW1wdHJlbmRfYWJzLnNjLCByYXJlZnlJRCA9IH4xKQp2YXJlZiA8LSB2YXJQb3dlcigtMC41LCB+bnlyQlQpCgojIGZ1bGwgbW9kZWxzCmlmKGZpbGUuZXhpc3RzKCd0ZW1wL21vZFRmdWxsSnR1cmVtMC5yZHMnKSl7CiAgbW9kVGZ1bGxKdHVyZW0wIDwtIHJlYWRSRFMoJ3RlbXAvbW9kVGZ1bGxKdHVyZW0wLnJkcycpCn0gZWxzZSB7CiAgbW9kVGZ1bGxKdHVyZW0wIDwtIGxtZShKdHV0cmVuZHJlbTAgfiB0ZW1wdHJlbmRfYWJzLnNjKlJFQUxNICsgCiAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKnRzaWduICsKICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqdGVtcGF2ZV9tZXRhYi5zYyArIAogICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYypzZWFzLnNjICsgCiAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKm1pY3JvY2xpbS5zYyArIAogICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYyptYXNzLnNjICsgCiAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKnNwZWVkLnNjICsgCiAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKmNvbnN1bWVyZnJhYy5zYyArCiAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKm5zcHAuc2MgKwogICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYyp0aGVybWFsX2JpYXMuc2M6dHNpZ24gKwogICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYypucHAuc2MgKwogICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYyp2ZWcuc2MgKwogICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYypkdXJhdGlvbi5zYyArCiAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKmh1bWFuX2Jvd2xlci5zYzpSRUFMTTIsCiAgICAgICAgICAgICAgICAgICAgICAgcmFuZG9tID0gcmFuZGVmLCB3ZWlnaHRzID0gdmFyZWYsIGRhdGEgPSB0cmVuZHNbaTIsXSwgbWV0aG9kID0gJ1JFTUwnKQogIHNhdmVSRFMobW9kVGZ1bGxKdHVyZW0wLCBmaWxlID0gJ3RlbXAvbW9kVGZ1bGxKdHVyZW0wLnJkcycpCn0KCmlmKGZpbGUuZXhpc3RzKCd0ZW1wL21vZFRmdWxsSmJldGFyZW0wLnJkcycpKXsKICBtb2RUZnVsbEpiZXRhcmVtMCA8LSByZWFkUkRTKCd0ZW1wL21vZFRmdWxsSmJldGFyZW0wLnJkcycpCn0gZWxzZSB7CiAgbW9kVGZ1bGxKYmV0YXJlbTAgPC0gbG1lKEpiZXRhdHJlbmRyZW0wIH4gdGVtcHRyZW5kX2Ficy5zYypSRUFMTSArIAogICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYyp0c2lnbiArCiAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKnRlbXBhdmVfbWV0YWIuc2MgKyAKICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2Mqc2Vhcy5zYyArIAogICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYyptaWNyb2NsaW0uc2MgKyAKICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqbWFzcy5zYyArIAogICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYypzcGVlZC5zYyArIAogICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYypjb25zdW1lcmZyYWMuc2MgKwogICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYypuc3BwLnNjICsKICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqdGhlcm1hbF9iaWFzLnNjOnRzaWduICsKICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqbnBwLnNjICsKICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqdmVnLnNjICsKICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqZHVyYXRpb24uc2MgKwogICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYypodW1hbl9ib3dsZXIuc2M6UkVBTE0yLAogICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbSA9IHJhbmRlZiwgd2VpZ2h0cyA9IHZhcmVmLCBkYXRhID0gdHJlbmRzW2kyLF0sIG1ldGhvZCA9ICdSRU1MJykKICBzYXZlUkRTKG1vZFRmdWxsSmJldGFyZW0wLCBmaWxlID0gJ3RlbXAvbW9kVGZ1bGxKYmV0YXJlbTAucmRzJykKfQoKaWYoZmlsZS5leGlzdHMoJ3RlbXAvbW9kVGZ1bGxIb3JucmVtMC5yZHMnKSl7CiAgbW9kVGZ1bGxIb3JucmVtMCA8LSByZWFkUkRTKCd0ZW1wL21vZFRmdWxsSG9ybnJlbTAucmRzJykKfSBlbHNlIHsKICBtb2RUZnVsbEhvcm5yZW0wIDwtIGxtZShIb3JudHJlbmRyZW0wIH4gdGVtcHRyZW5kX2Ficy5zYypSRUFMTSArIAogICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKnRzaWduICsKICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYyp0ZW1wYXZlX21ldGFiLnNjICsgCiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2Mqc2Vhcy5zYyArIAogICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKm1pY3JvY2xpbS5zYyArIAogICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKm1hc3Muc2MgKyAKICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYypzcGVlZC5zYyArIAogICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKmNvbnN1bWVyZnJhYy5zYyArCiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqbnNwcC5zYyArCiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqdGhlcm1hbF9iaWFzLnNjOnRzaWduICsKICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYypucHAuc2MgKwogICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKnZlZy5zYyArCiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqZHVyYXRpb24uc2MgKwogICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKmh1bWFuX2Jvd2xlci5zYzpSRUFMTTIsCiAgICAgICAgICAgICAgICAgICAgICByYW5kb20gPSByYW5kZWYsIHdlaWdodHMgPSB2YXJlZiwgZGF0YSA9IHRyZW5kc1tpMyxdLCBtZXRob2QgPSAnUkVNTCcpCiAgc2F2ZVJEUyhtb2RUZnVsbEhvcm5yZW0wLCBmaWxlID0gJ3RlbXAvbW9kVGZ1bGxIb3JucmVtMC5yZHMnKQp9CgpzdW1tYXJ5KG1vZFRmdWxsSnR1cmVtMCkKc3VtbWFyeShtb2RUZnVsbEpiZXRhcmVtMCkKc3VtbWFyeShtb2RUZnVsbEhvcm5yZW0wKQoKcnNxdWFyZWQobW9kVGZ1bGxKdHVyZW0wKQpyc3F1YXJlZChtb2RUZnVsbEpiZXRhcmVtMCkKcnNxdWFyZWQobW9kVGZ1bGxIb3JucmVtMCkKCmBgYAoKIyMjIFBsb3RzIGZyb20gdGhlIGZ1bGwgbW9kZWxzCiMjIyMgUGxvdCB0aGUgY29lZmZpY2llbnRzCmBgYHtyIHBsb3QgZnVsbFRtb2RzLCBmaWcuaGVpZ2h0PTEyLCBmaWcud2lkdGg9OX0KCmNvZWZzMSA8LSBzdW1tYXJ5KG1vZFRmdWxsSnR1cmVtMCkkdFRhYmxlCmNvZWZzMiA8LSBzdW1tYXJ5KG1vZFRmdWxsSmJldGFyZW0wKSR0VGFibGUKY29lZnMzIDwtIHN1bW1hcnkobW9kVGZ1bGxIb3JucmVtMCkkdFRhYmxlCgp2YXJzdG9wbG90IDwtIHVuaXF1ZShjKHJvd25hbWVzKGNvZWZzMSksIHJvd25hbWVzKGNvZWZzMiksIHJvd25hbWVzKGNvZWZzMykpKQp2YXJzdG9wbG90IDwtIHZhcnN0b3Bsb3Rbd2hpY2goIWdyZXBsKCdJbnRlcmNlcHQnLCB2YXJzdG9wbG90KSB8IGdyZXBsKCc6JywgdmFyc3RvcGxvdCkpXSAjIHZhcnMgdG8gcGxvdAoKcm93czFfMSA8LSB3aGljaChyb3duYW1lcyhjb2VmczEpICVpbiUgdmFyc3RvcGxvdCkgIyByb3dzIGluIGNvZWZzCnJvd3MxXzIgPC0gd2hpY2gocm93bmFtZXMoY29lZnMyKSAlaW4lIHZhcnN0b3Bsb3QpCnJvd3MxXzMgPC0gd2hpY2gocm93bmFtZXMoY29lZnMzKSAlaW4lIHZhcnN0b3Bsb3QpCnhsaW1zIDwtIHJhbmdlKGMoY29lZnMxW3Jvd3MxXzEsMV0gLSBjb2VmczFbcm93czFfMSwyXSwgY29lZnMxW3Jvd3MxXzEsMV0gKyBjb2VmczFbcm93czFfMSwyXSwgCiAgICAgICAgICAgICAgICAgIGNvZWZzMltyb3dzMV8yLDFdIC0gY29lZnMyW3Jvd3MxXzIsMl0sIGNvZWZzMltyb3dzMV8yLDFdICsgY29lZnMyW3Jvd3MxXzIsMl0sIAogICAgICAgICAgICAgICAgICBjb2VmczNbcm93czFfMywxXSAtIGNvZWZzM1tyb3dzMV8zLDJdLCBjb2VmczNbcm93czFfMywxXSArIGNvZWZzM1tyb3dzMV8zLDJdKSkKCgpjb2xzIDwtIGJyZXdlci5wYWwoMywgJ0RhcmsyJykgIyBmb3IgSnR1LCBKYmV0YSBhbmQgSG9ybiBtb2RlbHMKcGNocyA8LSBjKDE2LCAxNiwgMTYpCm9mZnMgPC0gYygwLjEsIDAsIC0wLjEpICMgb2Zmc2V0IHZlcnRpY2FsbHkgZm9yIGVhY2ggbW9kZWwKCgpwYXIobGFzID0gMSwgbWFpID0gYygwLjUsIDQsIDAuMSwgMC4xKSkKCnBsb3QoMCwwLCBjb2wgPSAnd2hpdGUnLCB4bGltID0geGxpbXMsIHlsaW0gPSBjKDEsbGVuZ3RoKHZhcnN0b3Bsb3QpKSwgeWF4dD0nbicsIHhsYWIgPSAnJywgeWxhYiA9JycpCmF4aXMoMiwgYXQgPSBsZW5ndGgodmFyc3RvcGxvdCk6MSwgbGFiZWxzID0gdmFyc3RvcGxvdCwgY2V4LmF4aXMgPSAwLjcpCmFibGluZSh2ID0gMCwgY29sID0gJ2dyZXknLCBsdHkgPSAyKQphYmxpbmUoaCA9IDE6bGVuZ3RoKHZhcnN0b3Bsb3QpLCBjb2wgPSAnZ3JleScsIGx0eSA9IDMpCmZvcihpIGluIDE6bGVuZ3RoKHZhcnN0b3Bsb3QpKXsKICBpZih2YXJzdG9wbG90W2ldICVpbiUgcm93bmFtZXMoY29lZnMxKSl7CiAgICB4ID0gY29lZnMxW3Jvd25hbWVzKGNvZWZzMSkgPT0gdmFyc3RvcGxvdFtpXSwgMV0KICAgIHNlID0gY29lZnMxW3Jvd25hbWVzKGNvZWZzMSkgPT0gdmFyc3RvcGxvdFtpXSwgMl0KICAgIHBvaW50cyh4LCBsZW5ndGgodmFyc3RvcGxvdCkgKyAxIC0gaSArIG9mZnNbMV0sIHBjaCA9IHBjaHNbMV0sIGNvbCA9IGNvbHNbMV0pCiAgICBsaW5lcyh4ID0gYyh4LXNlLCB4K3NlKSwgeSA9IGMobGVuZ3RoKHZhcnN0b3Bsb3QpICsgMSAtIGkgKyBvZmZzWzFdLCBsZW5ndGgodmFyc3RvcGxvdCkgKyAxIC0gaSArIG9mZnNbMV0pLCBjb2wgPSBjb2xzWzFdKQogIH0KICBpZih2YXJzdG9wbG90W2ldICVpbiUgcm93bmFtZXMoY29lZnMyKSl7CiAgICB4ID0gY29lZnMyW3Jvd25hbWVzKGNvZWZzMikgPT0gdmFyc3RvcGxvdFtpXSwgMV0KICAgIHNlID0gY29lZnMyW3Jvd25hbWVzKGNvZWZzMikgPT0gdmFyc3RvcGxvdFtpXSwgMl0KICAgIHBvaW50cyh4LCBsZW5ndGgodmFyc3RvcGxvdCkgKyAxIC0gaSArIG9mZnNbMl0sIHBjaCA9IHBjaHNbMl0sIGNvbCA9IGNvbHNbMl0pCiAgICBsaW5lcyh4ID0gYyh4LXNlLCB4K3NlKSwgeSA9IGMobGVuZ3RoKHZhcnN0b3Bsb3QpICsgMSAtIGkgKyBvZmZzWzJdLCBsZW5ndGgodmFyc3RvcGxvdCkgKyAxIC0gaSArIG9mZnNbMl0pLCBjb2wgPSBjb2xzWzJdKQogIH0KICBpZih2YXJzdG9wbG90W2ldICVpbiUgcm93bmFtZXMoY29lZnMzKSl7CiAgICB4ID0gY29lZnMzW3Jvd25hbWVzKGNvZWZzMykgPT0gdmFyc3RvcGxvdFtpXSwgMV0KICAgIHNlID0gY29lZnMzW3Jvd25hbWVzKGNvZWZzMykgPT0gdmFyc3RvcGxvdFtpXSwgMl0KICAgIHBvaW50cyh4LCBsZW5ndGgodmFyc3RvcGxvdCkgKyAxIC0gaSArIG9mZnNbM10sIHBjaCA9IHBjaHNbM10sIGNvbCA9IGNvbHNbM10pCiAgICBsaW5lcyh4ID0gYyh4LXNlLCB4K3NlKSwgeSA9IGMobGVuZ3RoKHZhcnN0b3Bsb3QpICsgMSAtIGkgKyBvZmZzWzNdLCBsZW5ndGgodmFyc3RvcGxvdCkgKyAxIC0gaSArIG9mZnNbM10pLCBjb2wgPSBjb2xzWzNdKQogIH0KfQpsZWdlbmQoJ3RvcGxlZnQnLCBjb2wgPSBjb2xzLCBwY2ggPSAxNiwgbHdkID0gMSwgbGVnZW5kID0gYygnSnR1JywgJ0piZXRhJywgJ0hvcm4nKSwgY2V4ID0gMC41KQpgYGAKCgojIyMjIFBsb3QgdGhlIG1haW4gZWZmZWN0cwojIyMjIyBNYW51YWxseQpgYGB7ciBtYWluIGVmZmVjdCBwbG90cywgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTEyLCBvdXQud2lkdGg9MjQsIG91dC5oZWlnaHQ9MjQsIGZpZy5yZXRpbmE9Mn0KCiMgc2V0IHVwIHRoZSB2YXJpYWJsZXMgdG8gcGxvdAojIGlmIHZhcmlhYmxlIGlzIGxvZ2dlZCBiZWZvcmUgc2NhbGluZyAoc2VlICdjZW50ZXIgYW5kIHNjYWxlJyBhYm92ZSksIHRoZW4gbmVlZCB0byBtYXJrIGl0IGhlcmUgYW5kIGV4cHJlc3MgdGhlIGxpbWl0cyBvbiBhIGxvZzEwIHNjYWxlIChldmVuIHRob3VnaCBsb2cgdHJhbnNmb3JtaW5nIGlzIGxvZykKdmFycyA8LSBkYXRhLmZyYW1lKHZhcnMgPSBjKCd0ZW1wdHJlbmRfYWJzJywgJ3RlbXBhdmVfbWV0YWInLCAnc2VhcycsICdtaWNyb2NsaW0nLCAnbWFzcycsICdzcGVlZCcsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbnN1bWVyZnJhYycsICduc3BwJywgJ3RoZXJtYWxfYmlhcycsICducHAnLCAndmVnJywgJ2R1cmF0aW9uJywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaHVtYW5fYm93bGVyJywgJ2h1bWFuX2Jvd2xlcicpLAogICAgICAgICAgIG1pbiA9ICAgICAgYygwLCAgMCwgICAwLjEsIC0yLCAgMCwgICAwLCAgIDAsICAgMC4zLCAtMTAsIDEuOSwgMCwgICAwLjUsIDAsICAgMCksIAogICAgICAgICAgIG1heCA9ICAgICAgYygyLCAgMzAsICAxNiwgIDAuOCwgOCwgICAyLCAgIDEsICAgMi42LCAxMCwgIDMuNywgMC4zLCAyLCAgIDEsICAgMSksCiAgICAgICAgICAgbG9nID0gICAgICBjKEYsICBGLCAgIEYsICAgVCwgICBULCAgIFQsICAgRiwgICBULCAgIEYsICAgVCwgICBULCAgIFQsICAgVCwgICBUKSwKICAgICAgICAgICBsZW4gPSAgICAgIGMoMTAwLCAgMTAwLCAxMDAsIDEwMCwgMTAwLCAxMDAsIDEwMCwgMTAwLCAxMDAsIDEwMCwgMTAwLCAxMDAsIDEwMCwgMTAwKSwKICAgICAgICAgICBkaXNjcmV0ZSA9IGMoRiwgIEYsICAgRiwgICBGLCAgIEYsICAgRiwgICBGLCAgIEYsICAgRiwgICBGLCAgIEYsICAgRiwgICBGLCAgIEYpLAogICAgICAgICAgIHBsdXMgPSAgICAgYygwLCAgMCwgICAwLCAgIDAsICAgMCwgICAxLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMSwgICAwLCAgIDEsICAgMSksICMgd2hhdCB0byBhZGQgYmVmb3JlIGxvZy1zY2FsaW5nCiAgICAgICAgICAgUkVBTE0gPSBjKHJlcCgnVGVycmVzdHJpYWwnLCAxMyksICdNYXJpbmUnKSwKICAgICAgICAgICBSRUFMTTIgPSBjKHJlcCgnVGVyckZyZXNoJywgMTMpLCAnTWFyaW5lJyksCiAgICAgICAgICAgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKQpiYXNlYWxsIDwtIHRyZW5kc1ssIC4odHlwZSA9ICdhbGwnLCAKICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZCA9IC0wLjAwMDEsCiAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjID0gMC4wMDAxLAogICAgICAgICAgICAgICAgICAgICAgdGVtcGF2ZV9tZXRhYi5zYyA9IG1lYW4odGVtcGF2ZV9tZXRhYi5zYywgbmEucm09VFJVRSksIAogICAgICAgICAgICAgICAgICAgICAgc2Vhcy5zYyA9IG1lYW4oc2Vhcy5zYywgbmEucm09VFJVRSksIAogICAgICAgICAgICAgICAgICAgICAgbWljcm9jbGltLnNjID0gbWVhbihtaWNyb2NsaW0uc2MsIG5hLnJtPVRSVUUpLCAKICAgICAgICAgICAgICAgICAgICAgIHNwZWVkLnNjID0gbWVhbihzcGVlZC5zYywgbmEucm09VFJVRSksIAogICAgICAgICAgICAgICAgICAgICAgbWFzcy5zYyA9IG1lYW4obWFzcy5zYywgbmEucm09VFJVRSksIAogICAgICAgICAgICAgICAgICAgICAgbnNwcC5zYyA9IDAsIAogICAgICAgICAgICAgICAgICAgICAgdGhlcm1hbF9iaWFzLnNjID0gbWVhbih0aGVybWFsX2JpYXMuc2MsIG5hLnJtPVRSVUUpLCAKICAgICAgICAgICAgICAgICAgICAgIG5wcC5zYyA9IG1lYW4obnBwLnNjLCBuYS5ybT1UUlVFKSwgCiAgICAgICAgICAgICAgICAgICAgICBodW1hbl9ib3dsZXIuc2MgPSBtZWFuKGh1bWFuX2Jvd2xlci5zYywgbmEucm09VFJVRSksIAogICAgICAgICAgICAgICAgICAgICAgdmVnLnNjID0gbWVhbih2ZWcuc2MsIG5hLnJtPVRSVUUpLCAKICAgICAgICAgICAgICAgICAgICAgIGNvbnN1bWVyZnJhYy5zYyA9IG1lYW4oY29uc3VtZXJmcmFjLnNjLCBuYS5ybT1UUlVFKSldCmJhc2V0ZXJyIDwtIHRyZW5kc1tSRUFMTSA9PSAnVGVycmVzdHJpYWwnLCAKICAgICAgICAgICAgICAgICAgIC4odHlwZSA9ICdUZXJyZXN0cmlhbCcsIAogICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmQgPSAtMC4wMDAxLAogICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjID0gMC4wMDAxLAogICAgICAgICAgICAgICAgICAgICB0ZW1wYXZlX21ldGFiLnNjID0gbWVhbih0ZW1wYXZlX21ldGFiLnNjLCBuYS5ybT1UUlVFKSwgCiAgICAgICAgICAgICAgICAgICAgIHNlYXMuc2MgPSBtZWFuKHNlYXMuc2MsIG5hLnJtPVRSVUUpLCAKICAgICAgICAgICAgICAgICAgICAgbWljcm9jbGltLnNjID0gbWVhbihtaWNyb2NsaW0uc2MsIG5hLnJtPVRSVUUpLCAKICAgICAgICAgICAgICAgICAgICAgc3BlZWQuc2MgPSBtZWFuKHNwZWVkLnNjLCBuYS5ybT1UUlVFKSwgCiAgICAgICAgICAgICAgICAgICAgIG1hc3Muc2MgPSBtZWFuKG1hc3Muc2MsIG5hLnJtPVRSVUUpLCAKICAgICAgICAgICAgICAgICAgICAgbnNwcC5zYyA9IDAsIAogICAgICAgICAgICAgICAgICAgICB0aGVybWFsX2JpYXMuc2MgPSAwLCAKICAgICAgICAgICAgICAgICAgICAgbnBwLnNjID0gbWVhbihucHAuc2MsIG5hLnJtPVRSVUUpLCAKICAgICAgICAgICAgICAgICAgICAgaHVtYW5fYm93bGVyLnNjID0gbWVhbihodW1hbl9ib3dsZXIuc2MsIG5hLnJtPVRSVUUpLCAKICAgICAgICAgICAgICAgICAgICAgdmVnLnNjID0gbWVhbih2ZWcuc2MsIG5hLnJtPVRSVUUpLCAKICAgICAgICAgICAgICAgICAgICAgY29uc3VtZXJmcmFjLnNjID0gbWVhbihjb25zdW1lcmZyYWMuc2MsIG5hLnJtPVRSVUUpKV0KYmFzZW1hciA8LSB0cmVuZHNbUkVBTE0gPT0gJ01hcmluZScsIAogICAgICAgICAgICAgICAgICAuKHR5cGUgPSAnTWFyaW5lJywKICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmQgPSAtMC4wMDAxLAogICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MgPSAwLjAwMDEsCiAgICAgICAgICAgICAgICAgICAgdGVtcGF2ZV9tZXRhYi5zYyA9IG1lYW4odGVtcGF2ZV9tZXRhYi5zYywgbmEucm09VFJVRSksIAogICAgICAgICAgICAgICAgICAgIHNlYXMuc2MgPSBtZWFuKHNlYXMuc2MsIG5hLnJtPVRSVUUpLCAKICAgICAgICAgICAgICAgICAgICBtaWNyb2NsaW0uc2MgPSBtZWFuKG1pY3JvY2xpbS5zYywgbmEucm09VFJVRSksIAogICAgICAgICAgICAgICAgICAgIHNwZWVkLnNjID0gbWVhbihzcGVlZC5zYywgbmEucm09VFJVRSksIAogICAgICAgICAgICAgICAgICAgIG1hc3Muc2MgPSBtZWFuKG1hc3Muc2MsIG5hLnJtPVRSVUUpLCAKICAgICAgICAgICAgICAgICAgICBuc3BwLnNjID0gMCwgCiAgICAgICAgICAgICAgICAgICAgdGhlcm1hbF9iaWFzLnNjID0gMCwgCiAgICAgICAgICAgICAgICAgICAgbnBwLnNjID0gbWVhbihucHAuc2MsIG5hLnJtPVRSVUUpLCAKICAgICAgICAgICAgICAgICAgICBodW1hbl9ib3dsZXIuc2MgPSBtZWFuKGh1bWFuX2Jvd2xlci5zYywgbmEucm09VFJVRSksIAogICAgICAgICAgICAgICAgICAgIHZlZy5zYyA9IG1lYW4odmVnLnNjLCBuYS5ybT1UUlVFKSwgCiAgICAgICAgICAgICAgICAgICAgY29uc3VtZXJmcmFjLnNjID0gbWVhbihjb25zdW1lcmZyYWMuc2MsIG5hLnJtPVRSVUUpKV0KYmFzZXRhYiA8LSByYmluZChiYXNlYWxsLCBiYXNldGVyciwgYmFzZW1hcikKYmFzZXRhYlssICc6PScoZHVyYXRpb24uc2MgPSAwLCBueXJCVCA9IDIwLCBTVFVEWV9JRCA9IDEyN0wsIHJhcmVmeUlEID0gJzEyN181MTQ2NjgnKV0KCiMgbWFrZSB0aGUgZGF0YSBmcmFtZXMgZm9yIGVhY2ggaW50ZXJhY3Rpb24gdG8gcGxvdCAgICAgICAgICAgICAgICAKZm9yKGogaW4gMTpucm93KHZhcnMpKXsKICAjIHNldCB1cCB0aGUgbWFpbiBlZmZlY3RzCiAgaWYodmFycyRsb2dbal0pewogICAgdGhpc2RhdCA8LSBkYXRhLmZyYW1lKG5ldyA9IDEwXnNlcSh2YXJzJG1pbltqXSwgdmFycyRtYXhbal0sIGxlbmd0aC5vdXQgPSB2YXJzJGxlbltqXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyID0gdmFycyR2YXJzW2pdLCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpCiAgfSAKICBpZighdmFycyRsb2dbal0pewogICAgdGhpc2RhdCA8LSBkYXRhLmZyYW1lKG5ldyA9IHNlcSh2YXJzJG1pbltqXSwgdmFycyRtYXhbal0sIGxlbmd0aC5vdXQgPSB2YXJzJGxlbltqXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyID0gdmFycyR2YXJzW2pdLCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpCiAgfQogIG5hbWVzKHRoaXNkYXQpIDwtIGModmFycyR2YXJzW2pdLCAndmFyJykKCiAgIyBzY2FsZSB0aGUgdmFyaWFibGUKICBjZW50IDwtIGF0dHIodHJlbmRzW1twYXN0ZTAodmFycyR2YXJzW2pdLCAnLnNjJyldXSwgJ3NjYWxlZDpjZW50ZXInKQogIHNjbCA8LSBhdHRyKHRyZW5kc1tbcGFzdGUwKHZhcnMkdmFyc1tqXSwgJy5zYycpXV0sICdzY2FsZWQ6c2NhbGUnKQogIGlmKGlzLm51bGwoY2VudCkpIGNlbnQgPC0gMAogIGlmKCFpcy5udWxsKGNlbnQpICYgIWlzLm51bGwoc2NsKSl7CiAgICBpZih2YXJzJGxvZ1tqXSkgdGhpc2RhdFtbcGFzdGUwKHZhcnMkdmFyW2pdLCAnLnNjJyldXSA8LSAobG9nKHRoaXNkYXRbW3ZhcnMkdmFyc1tqXV1dICsgdmFycyRwbHVzW2pdKSAtIGNlbnQpL3NjbAogICAgaWYoIXZhcnMkbG9nW2pdKSB0aGlzZGF0W1twYXN0ZTAodmFycyR2YXJbal0sICcuc2MnKV1dIDwtICh0aGlzZGF0W1t2YXJzJHZhcltqXV1dIC0gY2VudCkvc2NsCiAgfQoKICAjIG1lcmdlIHdpdGggdGhlIHJlc3Qgb2YgdGhlIGNvbHVtbnMKICAjIHVzZSByZWFsbS1zcGVjaWZpYyBhdmVyYWdlcyBmb3IgaHVtYW4gaW1wYWN0cwogIGlmKHZhcnMkdmFyc1tqXSAhPSAndHNpZ24nKSBjb2xuYW1lc3RvdXNlIDwtIHNldGRpZmYoY29sbmFtZXMoYmFzZXRhYiksIHBhc3RlMCh2YXJzJHZhcnNbal0sICcuc2MnKSkKICBpZih2YXJzJHZhcnNbal0gPT0gJ3RzaWduJykgY29sbmFtZXN0b3VzZSA8LSBzZXRkaWZmKGNvbG5hbWVzKGJhc2V0YWIpLCB2YXJzJHZhcltqXSkKICBpZih2YXJzJHZhcnNbal0gIT0gJ2h1bWFuX2Jvd2xlcicpewogICAgdGhpc2RhdCA8LSBjYmluZCh0aGlzZGF0LCBiYXNldGFiW3R5cGUgPT0gJ2FsbCcsIC4uY29sbmFtZXN0b3VzZV0pCiAgfQogIGlmKHZhcnMkdmFyc1tqXSA9PSAnaHVtYW5fYm93bGVyJyAmIHZhcnMkUkVBTE1bal0gPT0gJ1RlcnJlc3RyaWFsJyl7CiAgICB0aGlzZGF0IDwtIGNiaW5kKHRoaXNkYXQsIGJhc2V0YWJbdHlwZSA9PSAnVGVycmVzdHJpYWwnLCAuLmNvbG5hbWVzdG91c2VdKQogIH0KICBpZih2YXJzJHZhcnNbal0gPT0gJ2h1bWFuX2Jvd2xlcicgJiB2YXJzJFJFQUxNW2pdID09ICdNYXJpbmUnKXsKICAgIHRoaXNkYXQgPC0gY2JpbmQodGhpc2RhdCwgYmFzZXRhYlt0eXBlID09ICdNYXJpbmUnLCAuLmNvbG5hbWVzdG91c2VdKQogIH0KICAKICAjIGFkZCByZWFsbQogIHRoaXNkYXQkUkVBTE0gPC0gdmFycyRSRUFMTVtqXQogIHRoaXNkYXQkUkVBTE0yIDwtIHZhcnMkUkVBTE0yW2pdCiAgCiAgIyBtZXJnZSB3aXRoIHRoZSBwcmV2aW91cyBpdGVyYXRpb25zCiAgaWYoaiA9PSAxKSBuZXdkYXQgPC0gdGhpc2RhdAogIGlmKGogPiAxKXsKICAgIGNvbHN0b2FkZCA8LSBzZXRkaWZmKGNvbG5hbWVzKHRoaXNkYXQpLCBjb2xuYW1lcyhuZXdkYXQpKQogICAgZm9yKHRvYWRkIGluIGNvbHN0b2FkZCl7CiAgICAgIG5ld2RhdFtbdG9hZGRdXSA8LSBOQQogICAgfQogICAgCiAgICBjb2xzdG9hZGQyIDwtIHNldGRpZmYoY29sbmFtZXMobmV3ZGF0KSwgY29sbmFtZXModGhpc2RhdCkpCiAgICBmb3IodG9hZGQgaW4gY29sc3RvYWRkMil7CiAgICAgIHRoaXNkYXRbW3RvYWRkXV0gPC0gTkEKICAgIH0KICAgIAogICAgbmV3ZGF0IDwtIHJiaW5kKG5ld2RhdCwgdGhpc2RhdCkKICB9IAp9CgojIGNoYXJhY3RlciBzbyB0aGF0IG5ldyBsZXZlbHMgY2FuIGJlIGFkZGVkCm5ld2RhdCRSRUFMTSA8LSBhcy5jaGFyYWN0ZXIobmV3ZGF0JFJFQUxNKQpuZXdkYXQkUkVBTE0yIDwtIGFzLmNoYXJhY3RlcihuZXdkYXQkUkVBTE0yKQoKIyBhZGQgZXh0cmEgcm93cyBzbyB0aGF0IGFsbCBmYWN0b3IgbGV2ZWxzIGFyZSByZXByZXNlbnRlZCAoZm9yIHByZWRpY3QubG1lIHRvIHdvcmspCm5ld2RhdCA8LSByYmluZChuZXdkYXRbMTo2LCBdLCBuZXdkYXQpCm5ld2RhdCRSRUFMTVsxOjZdIDwtIGMoJ01hcmluZScsICdNYXJpbmUnLCAnRnJlc2h3YXRlcicsICdGcmVzaHdhdGVyJywgJ1RlcnJlc3RyaWFsJywgJ1RlcnJlc3RyaWFsJykKbmV3ZGF0JFJFQUxNMlsxOjZdIDwtIGMoJ01hcmluZScsICdNYXJpbmUnLCAnVGVyckZyZXNoJywgJ1RlcnJGcmVzaCcsICdUZXJyRnJlc2gnLCAnVGVyckZyZXNoJykKbmV3ZGF0JHRlbXB0cmVuZF9hYnMuc2NbMTo2XSA8LSByZXAoMC4wMDAxLCA2KQpuZXdkYXQkdGVtcHRyZW5kWzE6Nl0gPC0gcmVwKGMoMC4wMDAxLCAtMC4wMDAxKSwgMykKbmV3ZGF0JHZhclsxOjZdIDwtICd0ZXN0JwoKIyB0cmltIHRvIGF0IGxlYXN0IHNvbWUgdGVtcGVyYXR1cmUgY2hhbmdlIChzbyB0aGF0IHRzaWduIGlzIC0xIG9yIDEpCm5ld2RhdCA8LSBuZXdkYXRbbmV3ZGF0JHRlbXB0cmVuZF9hYnMuc2MgIT0gMCxdCgojIHNldCB1cCB0c2lnbgpuZXdkYXQkdHNpZ24gPC0gZmFjdG9yKHNpZ24obmV3ZGF0JHRlbXB0cmVuZCkpCgoKIyBtYWtlIHByZWRpY3Rpb25zCm5ld2RhdCRwcmVkc0p0dSA8LSBwcmVkaWN0KG9iamVjdCA9IG1vZFRmdWxsSnR1cmVtMCwgbmV3ZGF0YSA9IG5ld2RhdCwgbGV2ZWwgPSAwKQpuZXdkYXQkcHJlZHNKYmV0YSA8LSBwcmVkaWN0KG9iamVjdCA9IG1vZFRmdWxsSmJldGFyZW0wLCBuZXdkYXRhID0gbmV3ZGF0LCBsZXZlbCA9IDApCm5ld2RhdCRwcmVkc0hvcm4gPC0gcHJlZGljdChvYmplY3QgPSBtb2RUZnVsbEhvcm5yZW0wLCBuZXdkYXRhID0gbmV3ZGF0LCBsZXZlbCA9IDApCgojY29tcHV0ZSBzdGFuZGFyZCBlcnJvciBmb3IgcHJlZGljdGlvbnMKIyBmcm9tIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzE0MzU4ODExL2V4dHJhY3QtcHJlZGljdGlvbi1iYW5kLWZyb20tbG1lLWZpdApEZXNpZ25tYXRKdHUgPC0gbW9kZWwubWF0cml4KGV2YWwoZXZhbChtb2RUZnVsbEp0dXJlbTAkY2FsbCRmaXhlZClbLTJdKSwgbmV3ZGF0KQpEZXNpZ25tYXRKYmV0YSA8LSBtb2RlbC5tYXRyaXgoZXZhbChldmFsKG1vZFRmdWxsSmJldGFyZW0wJGNhbGwkZml4ZWQpWy0yXSksIG5ld2RhdCkKRGVzaWdubWF0SG9ybiA8LSBtb2RlbC5tYXRyaXgoZXZhbChldmFsKG1vZFRmdWxsSG9ybnJlbTAkY2FsbCRmaXhlZClbLTJdKSwgbmV3ZGF0KQoKcHJlZHZhckp0dSA8LSBkaWFnKERlc2lnbm1hdEp0dSAlKiUgbW9kVGZ1bGxKdHVyZW0wJHZhckZpeCAlKiUgdChEZXNpZ25tYXRKdHUpKQpwcmVkdmFySmJldGEgPC0gZGlhZyhEZXNpZ25tYXRKYmV0YSAlKiUgbW9kVGZ1bGxKYmV0YXJlbTAkdmFyRml4ICUqJSB0KERlc2lnbm1hdEpiZXRhKSkKcHJlZHZhckhvcm4gPC0gZGlhZyhEZXNpZ25tYXRIb3JuICUqJSBtb2RUZnVsbEhvcm5yZW0wJHZhckZpeCAlKiUgdChEZXNpZ25tYXRIb3JuKSkKCm5ld2RhdCRTRV9KdHUgPC0gc3FydChwcmVkdmFySnR1KSAKbmV3ZGF0JFNFX0piZXRhIDwtIHNxcnQocHJlZHZhckpiZXRhKSAKbmV3ZGF0JFNFX0hvcm4gPC0gc3FydChwcmVkdmFySG9ybikgCgojIHByZXAgdGhlIHBsb3RzCnZhcnBsb3RzIDwtIHZlY3RvcignbGlzdCcsIG5yb3codmFycykpCmZvcihqIGluIDE6bGVuZ3RoKHZhcnBsb3RzKSl7CiAgc3VicyA8LSBuZXdkYXQkdmFyID09IHZhcnMkdmFyc1tqXSAjIHdoaWNoIHJvd3Mgb2YgbmV3ZGF0CiAgeHZhciA8LSB2YXJzJHZhcnNbal0KICB0aXRsZSA8LSB2YXJzJHZhcnNbal0KICBpZih2YXJzJHZhcnNbal0gJWluJSBjKCdodW1hbl9ib3dsZXInKSl7CiAgICBzdWJzIDwtIG5ld2RhdCR2YXIgPT0gdmFycyR2YXJzW2pdICYgbmV3ZGF0JFJFQUxNMiA9PSB2YXJzJFJFQUxNMltqXQogICAgdGl0bGUgPC0gcGFzdGUwKCdodW1hbjonLCB2YXJzJFJFQUxNMltqXSkKICB9IAoKICBzZSA8LSAxCiAgdGhpc3Bsb3QgPC0gZ2dwbG90KG5ld2RhdFtzdWJzLCBdLCAKICAgICAgICAgICAgICAgICAgICAgYWVzX3N0cmluZyh4ID0geHZhciwgeSA9ICdwcmVkc0p0dScpKSArCiAgICBnZW9tX2xpbmUoKSArCiAgICBnZW9tX3JpYmJvbihhZXMoeW1pbiA9IHByZWRzSnR1IC0gc2UqU0VfSnR1LCB5bWF4ID0gcHJlZHNKdHUgKyBzZSpTRV9KdHUpLCBhbHBoYSA9IDAuNSwgZmlsbCA9ICJncmV5IikgKwogICAgZ2VvbV9saW5lKGFlcyh5ID0gcHJlZHNKYmV0YSksIGNvbG9yID0gJ3JlZCcpICsKICAgIGdlb21fcmliYm9uKGFlcyh5bWluID0gcHJlZHNKYmV0YSAtIHNlKlNFX0piZXRhLCB5bWF4ID0gcHJlZHNKYmV0YSArIHNlKlNFX0piZXRhKSwgYWxwaGEgPSAwLjUsIGZpbGwgPSAicmVkIikgKwogICAgZ2VvbV9saW5lKGFlcyh5ID0gcHJlZHNIb3JuKSwgY29sb3IgPSAnYmx1ZScpICsKICAgIGdlb21fcmliYm9uKGFlcyh5bWluID0gcHJlZHNIb3JuIC0gc2UqU0VfSG9ybiwgeW1heCA9IHByZWRzSG9ybiArIHNlKlNFX0hvcm4pLCBhbHBoYSA9IDAuNSwgZmlsbCA9ICJibHVlIikgKwogICAgI2Nvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLCAwLjQpKSArCiAgICB0aGVtZShwbG90Lm1hcmdpbiA9IHVuaXQoYygwLjUsMCwwLjUsMCksICdjbScpKSArCiAgICBsYWJzKHRpdGxlID0gdGl0bGUpIAogIHZhcnBsb3RzW1tqXV0gPC0gdGhpc3Bsb3QKICBpZih2YXJzJGxvZ1tqXSAmICF2YXJzJGRpc2NyZXRlW2pdKXsKICAgIHZhcnBsb3RzW1tqXV0gPC0gdGhpc3Bsb3QgKyBzY2FsZV94X2xvZzEwKCkKICB9Cn0KCmdyaWQuYXJyYW5nZShncm9icyA9IHZhcnBsb3RzLCBuY29sID0gMykKCiMgd3JpdGUgb3V0IHRoZSBpbnRlcmFjdGlvbnMKd3JpdGUuY3N2KG5ld2RhdCwgZmlsZSA9ICdvdXRwdXQvbWFpbmVmZmVjdHMuY3N2JykKCmBgYAojIyMjIyBVc2luZyBzalBsb3QKRG9lc24ndCB3b3JrIG5vdwpgYGB7ciBzalBsb3QgZm9yIGZ1bGwgbW9kZWwsIGV2YWwgPSBGQUxTRX0KcmVxdWlyZShzalBsb3QpCiMgcDEgPC0gc2pQbG90OjpwbG90X21vZGVsKG1vZFRmdWxsSnR1cmVtMCwgdHlwZSA9ICdlc3QnLCB0ZXJtcyA9IGMoJ3RlbXB0cmVuZF9hYnMuc2MnKSkKCmBgYAoKIyMjIyBQbG90IGludGVyYWN0aW9ucyAoSmFjY2FyZCB0dXJub3ZlcikKYGBge3IgaW50ZXJhY3Rpb24gcGxvdHMgbW9kVGZ1bGxKdHVyZW0wLCBmaWcuaGVpZ2h0ID0gMTMsIGZpZy53aWR0aCA9IDl9CgojIHNldCB1cCB0aGUgaW50ZXJhY3Rpb25zIHRvIHBsb3QKIyBpZiB2YXJpYWJsZSBpcyBsb2dnZWQgYmVmb3JlIHNjYWxpbmcgKHNlZSAnY2VudGVyIGFuZCBzY2FsZScgYWJvdmUpLCB0aGVuIG5lZWQgdG8gbWFyayBpdCBoZXJlIGFuZCBleHByZXNzIHRoZSBsaW1pdHMgb24gYSBsb2cxMCBzY2FsZSAoZXZlbiB0aG91Z2ggbG9nIHRyYW5zZm9ybWluZyBpcyBsb2cpCmludHMgPC0gZGF0YS5mcmFtZSh2YXJzID0gYygndHNpZ24nLCAndGVtcGF2ZV9tZXRhYicsICdzZWFzJywgJ21pY3JvY2xpbScsICdtYXNzJywgJ3NwZWVkJywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29uc3VtZXJmcmFjJywgJ25zcHAnLCAndGhlcm1hbF9iaWFzJywgJ25wcCcsICd2ZWcnLCAnZHVyYXRpb24nLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdodW1hbl9ib3dsZXInLCAnaHVtYW5fYm93bGVyJyksCiAgICAgICAgICAgbWluID0gICAgICBjKDEsICAwLCAgIDAuMSwgLTIsICAwLCAgIDAsICAgMCwgICAwLjMsIC0xMCwgMS45LCAwLCAgIDAuNSwgMCwgICAwKSwgCiAgICAgICAgICAgbWF4ID0gICAgICBjKDIsICAzMCwgIDE2LCAgMC44LCA4LCAgIDIsICAgMSwgICAyLjYsIDEwLCAgMy43LCAwLjMsIDIsICAgMSwgICAxKSwKICAgICAgICAgICBsb2cgPSAgICAgIGMoRiwgIEYsICAgRiwgICBULCAgIFQsICAgVCwgICBGLCAgIFQsICAgRiwgICBULCAgIFQsICAgVCwgICBULCAgIFQpLAogICAgICAgICAgIGxlbiA9ICAgICAgYygyLCAgMTAwLCAxMDAsIDEwMCwgMTAwLCAxMDAsIDEwMCwgMTAwLCAxMDAsIDEwMCwgMTAwLCAxMDAsIDEwMCwgMTAwKSwKICAgICAgICAgICBkaXNjcmV0ZSA9IGMoVCwgIEYsICAgRiwgICBGLCAgIEYsICAgRiwgICBGLCAgIEYsICAgRiwgICBGLCAgIEYsICAgRiwgICBGLCAgIEYpLAogICAgICAgICAgIHBsdXMgPSAgICAgYygwLCAgMCwgICAwLCAgIDAsICAgMCwgICAxLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMSwgICAwLCAgIDEsICAgMSksICMgd2hhdCB0byBhZGQgYmVmb3JlIGxvZy1zY2FsaW5nCiAgICAgICAgICAgUkVBTE0gPSBjKHJlcCgnVGVycmVzdHJpYWwnLCAxMiksICdUZXJyZXN0cmlhbCcsICdNYXJpbmUnKSwKICAgICAgICAgICBSRUFMTTIgPSBjKHJlcCgnVGVyckZyZXNoJywgMTMpLCAnTWFyaW5lJyksCiAgICAgICAgICAgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKQpiYXNlYWxsIDwtIHRyZW5kc1ssIC4odHlwZSA9ICdhbGwnLCB0ZW1wYXZlX21ldGFiLnNjID0gbWVhbih0ZW1wYXZlX21ldGFiLnNjLCBuYS5ybT1UUlVFKSwgCiAgICAgICAgICAgICAgICAgICAgICBzZWFzLnNjID0gbWVhbihzZWFzLnNjLCBuYS5ybT1UUlVFKSwgCiAgICAgICAgICAgICAgICAgICAgICBtaWNyb2NsaW0uc2MgPSBtZWFuKG1pY3JvY2xpbS5zYywgbmEucm09VFJVRSksIAogICAgICAgICAgICAgICAgICAgICAgc3BlZWQuc2MgPSBtZWFuKHNwZWVkLnNjLCBuYS5ybT1UUlVFKSwgCiAgICAgICAgICAgICAgICAgICAgICBtYXNzLnNjID0gbWVhbihtYXNzLnNjLCBuYS5ybT1UUlVFKSwgCiAgICAgICAgICAgICAgICAgICAgICBuc3BwLnNjID0gMCwgCiAgICAgICAgICAgICAgICAgICAgICB0aGVybWFsX2JpYXMuc2MgPSBtZWFuKHRoZXJtYWxfYmlhcy5zYywgbmEucm09VFJVRSksIAogICAgICAgICAgICAgICAgICAgICAgbnBwLnNjID0gbWVhbihucHAuc2MsIG5hLnJtPVRSVUUpLCAKICAgICAgICAgICAgICAgICAgICAgIGh1bWFuX2Jvd2xlci5zYyA9IG1lYW4oaHVtYW5fYm93bGVyLnNjLCBuYS5ybT1UUlVFKSwgCiAgICAgICAgICAgICAgICAgICAgICB2ZWcuc2MgPSBtZWFuKHZlZy5zYywgbmEucm09VFJVRSksIAogICAgICAgICAgICAgICAgICAgICAgY29uc3VtZXJmcmFjLnNjID0gbWVhbihjb25zdW1lcmZyYWMuc2MsIG5hLnJtPVRSVUUpKV0KYmFzZXRlcnIgPC0gdHJlbmRzW1JFQUxNID09ICdUZXJyZXN0cmlhbCcsIAogICAgICAgICAgICAgICAgICAgLih0eXBlID0gJ1RlcnJlc3RyaWFsJywgCiAgICAgICAgICAgICAgICAgICAgIHRlbXBhdmVfbWV0YWIuc2MgPSBtZWFuKHRlbXBhdmVfbWV0YWIuc2MsIG5hLnJtPVRSVUUpLCAKICAgICAgICAgICAgICAgICAgICAgc2Vhcy5zYyA9IG1lYW4oc2Vhcy5zYywgbmEucm09VFJVRSksIAogICAgICAgICAgICAgICAgICAgICBtaWNyb2NsaW0uc2MgPSBtZWFuKG1pY3JvY2xpbS5zYywgbmEucm09VFJVRSksIAogICAgICAgICAgICAgICAgICAgICBzcGVlZC5zYyA9IG1lYW4oc3BlZWQuc2MsIG5hLnJtPVRSVUUpLCAKICAgICAgICAgICAgICAgICAgICAgbWFzcy5zYyA9IG1lYW4obWFzcy5zYywgbmEucm09VFJVRSksIAogICAgICAgICAgICAgICAgICAgICBuc3BwLnNjID0gMCwgCiAgICAgICAgICAgICAgICAgICAgIHRoZXJtYWxfYmlhcy5zYyA9IDAsIAogICAgICAgICAgICAgICAgICAgICBucHAuc2MgPSBtZWFuKG5wcC5zYywgbmEucm09VFJVRSksIAogICAgICAgICAgICAgICAgICAgICBodW1hbl9ib3dsZXIuc2MgPSBtZWFuKGh1bWFuX2Jvd2xlci5zYywgbmEucm09VFJVRSksIAogICAgICAgICAgICAgICAgICAgICB2ZWcuc2MgPSBtZWFuKHZlZy5zYywgbmEucm09VFJVRSksIAogICAgICAgICAgICAgICAgICAgICBjb25zdW1lcmZyYWMuc2MgPSBtZWFuKGNvbnN1bWVyZnJhYy5zYywgbmEucm09VFJVRSkpXQpiYXNlbWFyIDwtIHRyZW5kc1tSRUFMTSA9PSAnTWFyaW5lJywgCiAgICAgICAgICAgICAgICAgIC4odHlwZSA9ICdNYXJpbmUnLAogICAgICAgICAgICAgICAgICAgIHRlbXBhdmVfbWV0YWIuc2MgPSBtZWFuKHRlbXBhdmVfbWV0YWIuc2MsIG5hLnJtPVRSVUUpLCAKICAgICAgICAgICAgICAgICAgICBzZWFzLnNjID0gbWVhbihzZWFzLnNjLCBuYS5ybT1UUlVFKSwgCiAgICAgICAgICAgICAgICAgICAgbWljcm9jbGltLnNjID0gbWVhbihtaWNyb2NsaW0uc2MsIG5hLnJtPVRSVUUpLCAKICAgICAgICAgICAgICAgICAgICBzcGVlZC5zYyA9IG1lYW4oc3BlZWQuc2MsIG5hLnJtPVRSVUUpLCAKICAgICAgICAgICAgICAgICAgICBtYXNzLnNjID0gbWVhbihtYXNzLnNjLCBuYS5ybT1UUlVFKSwgCiAgICAgICAgICAgICAgICAgICAgbnNwcC5zYyA9IDAsIAogICAgICAgICAgICAgICAgICAgIHRoZXJtYWxfYmlhcy5zYyA9IDAsIAogICAgICAgICAgICAgICAgICAgIG5wcC5zYyA9IG1lYW4obnBwLnNjLCBuYS5ybT1UUlVFKSwgCiAgICAgICAgICAgICAgICAgICAgaHVtYW5fYm93bGVyLnNjID0gbWVhbihodW1hbl9ib3dsZXIuc2MsIG5hLnJtPVRSVUUpLCAKICAgICAgICAgICAgICAgICAgICB2ZWcuc2MgPSBtZWFuKHZlZy5zYywgbmEucm09VFJVRSksIAogICAgICAgICAgICAgICAgICAgIGNvbnN1bWVyZnJhYy5zYyA9IG1lYW4oY29uc3VtZXJmcmFjLnNjLCBuYS5ybT1UUlVFKSldCmJhc2V0YWIgPC0gcmJpbmQoYmFzZWFsbCwgYmFzZXRlcnIsIGJhc2VtYXIpCmJhc2V0YWJbLCAnOj0nKGR1cmF0aW9uLnNjID0gMCwgbnlyQlQgPSAyMCwgU1RVRFlfSUQgPSAxMjdMLCByYXJlZnlJRCA9ICcxMjdfNTE0NjY4JyldCgojIG1ha2UgdGhlIGRhdGEgZnJhbWVzIGZvciBlYWNoIGludGVyYWN0aW9uIHRvIHBsb3QgICAgICAgICAgICAgICAgCmZvcihqIGluIDE6bnJvdyhpbnRzKSl7CiAgIyBzZXQgdXAgYSBncmlkIG9mIHRlbXBlcmF0dXJlIHRyZW5kcyBhbmQgdGhlIGludGVyYWN0aW5nIHZhcmlhYmxlCiAgaWYoaW50cyRsb2dbal0pIGludHZhcnMgPC0gbGlzdCh0ZW1wdHJlbmQgPSBzZXEoLTEuNSwgMS41LCBsZW5ndGgub3V0ID0gMTAwKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgPSAxMF5zZXEoaW50cyRtaW5bal0sIGludHMkbWF4W2pdLCBsZW5ndGgub3V0ID0gaW50cyRsZW5bal0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciA9IGludHMkdmFyc1tqXSkKICBpZighaW50cyRsb2dbal0pIGludHZhcnMgPC0gbGlzdCh0ZW1wdHJlbmQgPSBzZXEoLTEuNSwgMS41LCBsZW5ndGgub3V0ID0gMTAwKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3ID0gc2VxKGludHMkbWluW2pdLCBpbnRzJG1heFtqXSwgbGVuZ3RoLm91dCA9IGludHMkbGVuW2pdKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgPSBpbnRzJHZhcnNbal0pCiAgbmFtZXMoaW50dmFycykgPC0gYygndGVtcHRyZW5kJywgaW50cyR2YXJzW2pdLCAndmFyJykKICB0aGlzZGF0IDwtIGV4cGFuZC5ncmlkKGludHZhcnMpCiAgCiAgIyBzY2FsZSB0aGUgaW50ZXJhY3RpbmcgdmFyaWFibGUKICBjZW50IDwtIGF0dHIodHJlbmRzW1twYXN0ZTAoaW50cyR2YXJbal0sICcuc2MnKV1dLCAnc2NhbGVkOmNlbnRlcicpCiAgc2NsIDwtIGF0dHIodHJlbmRzW1twYXN0ZTAoaW50cyR2YXJbal0sICcuc2MnKV1dLCAnc2NhbGVkOnNjYWxlJykKICBpZighaXMubnVsbChjZW50KSAmICFpcy5udWxsKHNjbCkpewogICAgaWYoaW50cyRsb2dbal0pIHRoaXNkYXRbW3Bhc3RlMChpbnRzJHZhcltqXSwgJy5zYycpXV0gPC0gKGxvZyh0aGlzZGF0W1tpbnRzJHZhcnNbal1dXSArIGludHMkcGx1c1tqXSkgLSBjZW50KS9zY2wKICAgIGlmKCFpbnRzJGxvZ1tqXSkgdGhpc2RhdFtbcGFzdGUwKGludHMkdmFyW2pdLCAnLnNjJyldXSA8LSAodGhpc2RhdFtbaW50cyR2YXJbal1dXSAtIGNlbnQpL3NjbAogIH0KCiAgIyBtZXJnZSB3aXRoIHRoZSByZXN0IG9mIHRoZSBjb2x1bW5zCiAgIyB1c2UgcmVhbG0tc3BlY2lmaWMgYXZlcmFnZXMgZm9yIGh1bWFuIGltcGFjdHMKICBpZihpbnRzJHZhcnNbal0gIT0gJ3RzaWduJykgY29sbmFtZXN0b3VzZSA8LSBzZXRkaWZmKGNvbG5hbWVzKGJhc2V0YWIpLCBwYXN0ZTAoaW50cyR2YXJbal0sICcuc2MnKSkKICBpZihpbnRzJHZhcnNbal0gPT0gJ3RzaWduJykgY29sbmFtZXN0b3VzZSA8LSBzZXRkaWZmKGNvbG5hbWVzKGJhc2V0YWIpLCBpbnRzJHZhcltqXSkKICBpZihpbnRzJHZhcnNbal0gIT0gJ2h1bWFuX2Jvd2xlcicpewogICAgdGhpc2RhdCA8LSBjYmluZCh0aGlzZGF0LCBiYXNldGFiW3R5cGUgPT0gJ2FsbCcsIC4uY29sbmFtZXN0b3VzZV0pCiAgfQogIGlmKGludHMkdmFyc1tqXSA9PSAnaHVtYW5fYm93bGVyJyAmIGludHMkUkVBTE1bal0gPT0gJ1RlcnJlc3RyaWFsJyl7CiAgICB0aGlzZGF0IDwtIGNiaW5kKHRoaXNkYXQsIGJhc2V0YWJbdHlwZSA9PSAnVGVycmVzdHJpYWwnLCAuLmNvbG5hbWVzdG91c2VdKQogIH0KICBpZihpbnRzJHZhcnNbal0gPT0gJ2h1bWFuX2Jvd2xlcicgJiBpbnRzJFJFQUxNW2pdID09ICdNYXJpbmUnKXsKICAgIHRoaXNkYXQgPC0gY2JpbmQodGhpc2RhdCwgYmFzZXRhYlt0eXBlID09ICdNYXJpbmUnLCAuLmNvbG5hbWVzdG91c2VdKQogIH0KICAKICAjIGFkZCByZWFsbQogIHRoaXNkYXQkUkVBTE0gPC0gaW50cyRSRUFMTVtqXQogIHRoaXNkYXQkUkVBTE0yIDwtIGludHMkUkVBTE0yW2pdCiAgCiAgIyBtZXJnZSB3aXRoIHRoZSBwcmV2aW91cyBpdGVyYXRpb25zCiAgaWYoaiA9PSAxKSBuZXdkYXQgPC0gdGhpc2RhdAogIGlmKGogPiAxKXsKICAgIGNvbHN0b2FkZCA8LSBzZXRkaWZmKGNvbG5hbWVzKHRoaXNkYXQpLCBjb2xuYW1lcyhuZXdkYXQpKQogICAgZm9yKHRvYWRkIGluIGNvbHN0b2FkZCl7CiAgICAgIG5ld2RhdFtbdG9hZGRdXSA8LSBOQQogICAgfQogICAgCiAgICBjb2xzdG9hZGQyIDwtIHNldGRpZmYoY29sbmFtZXMobmV3ZGF0KSwgY29sbmFtZXModGhpc2RhdCkpCiAgICBmb3IodG9hZGQgaW4gY29sc3RvYWRkMil7CiAgICAgIHRoaXNkYXRbW3RvYWRkXV0gPC0gTkEKICAgIH0KICAgIAogICAgbmV3ZGF0IDwtIHJiaW5kKG5ld2RhdCwgdGhpc2RhdCkKICB9IAp9CgojIGNoYXJhY3RlciBzbyB0aGF0IG5ldyBsZXZlbHMgY2FuIGJlIGFkZGVkCm5ld2RhdCRSRUFMTSA8LSBhcy5jaGFyYWN0ZXIobmV3ZGF0JFJFQUxNKQpuZXdkYXQkUkVBTE0yIDwtIGFzLmNoYXJhY3RlcihuZXdkYXQkUkVBTE0yKQoKIyBhZGQgZXh0cmEgcm93cyBzbyB0aGF0IGFsbCBmYWN0b3IgbGV2ZWxzIGFyZSByZXByZXNlbnRlZCAoZm9yIHByZWRpY3QubG1lIHRvIHdvcmspCm5ld2RhdCA8LSByYmluZChuZXdkYXRbMTo2LCBdLCBuZXdkYXQpCm5ld2RhdCRSRUFMTVsxOjZdIDwtIGMoJ01hcmluZScsICdNYXJpbmUnLCAnRnJlc2h3YXRlcicsICdGcmVzaHdhdGVyJywgJ1RlcnJlc3RyaWFsJywgJ1RlcnJlc3RyaWFsJykKbmV3ZGF0JFJFQUxNMlsxOjZdIDwtIGMoJ01hcmluZScsICdNYXJpbmUnLCAnVGVyckZyZXNoJywgJ1RlcnJGcmVzaCcsICdUZXJyRnJlc2gnLCAnVGVyckZyZXNoJykKbmV3ZGF0JHRlbXB0cmVuZFsxOjZdIDwtIGMoLTEsIDEsIC0xLCAxLCAtMSwgMSkKCiMgdHJpbSB0byBhdCBsZWFzdCBzb21lIHRlbXBlcmF0dXJlIGNoYW5nZSAoc28gdGhhdCB0c2lnbiBpcyAtMSBvciAxKQpuZXdkYXQgPC0gbmV3ZGF0W25ld2RhdCR0ZW1wdHJlbmQgIT0gMCxdCgojIHNjYWxlIHRoZSB0ZW1wZXJhdHVyZSB2YXJzCm5ld2RhdCR0ZW1wdHJlbmQuc2MgPC0gbmV3ZGF0JHRlbXB0cmVuZC9hdHRyKHRyZW5kcyR0ZW1wdHJlbmQuc2MsICdzY2FsZWQ6c2NhbGUnKSAKbmV3ZGF0JHRlbXB0cmVuZF9hYnMgPC0gYWJzKG5ld2RhdCR0ZW1wdHJlbmQpCm5ld2RhdCR0ZW1wdHJlbmRfYWJzLnNjIDwtIChuZXdkYXQkdGVtcHRyZW5kX2FicykvYXR0cih0cmVuZHMkdGVtcHRyZW5kX2Ficy5zYywgJ3NjYWxlZDpzY2FsZScpCm5ld2RhdCR0c2lnbiA8LSBmYWN0b3Ioc2lnbihuZXdkYXQkdGVtcHRyZW5kKSkKCiMgbWFrZSBwcmVkaWN0aW9ucwpuZXdkYXQkcHJlZHMgPC0gcHJlZGljdChvYmplY3QgPSBtb2RUZnVsbEp0dXJlbTAsIG5ld2RhdGEgPSBuZXdkYXQsIGxldmVsID0gMCkKCiNyZW1vdmUgdGhlIGV4dHJhIHJvd3MKbmV3ZGF0IDwtIG5ld2RhdFs1Om5yb3cobmV3ZGF0KSwgXQoKIyBwcmVwIHRoZSBwbG90cwppbnRwbG90cyA8LSB2ZWN0b3IoJ2xpc3QnLCBucm93KGludHMpKQpmb3IoaiBpbiAxOmxlbmd0aChpbnRwbG90cykpewogIHN1YnMgPC0gbmV3ZGF0JHZhciA9PSBpbnRzJHZhcnNbal0gJiBuZXdkYXQkdGVtcHRyZW5kID4gMCAjIHNlbGVjdCB3YXJtaW5nIHNpZGUKICB4dmFyIDwtICd0ZW1wdHJlbmRfYWJzJwogIHRpdGxlIDwtIGludHMkdmFyc1tqXQogIGlmKGludHMkdmFyc1tqXSAlaW4lIGMoJ3RzaWduJykpewogICAgc3VicyA8LSBuZXdkYXQkdmFyID09IGludHMkdmFyc1tqXQogIH0gCiAgaWYoaW50cyR2YXJzW2pdICVpbiUgYygndGhlcm1hbF9iaWFzJykpewogICAgc3VicyA8LSBuZXdkYXQkdmFyID09IGludHMkdmFyc1tqXQogICAgeHZhciA8LSAndGVtcHRyZW5kJwogIH0gCiAgaWYoaW50cyR2YXJzW2pdICVpbiUgYygnaHVtYW5fYm93bGVyJykpewogICAgc3VicyA8LSBuZXdkYXQkdmFyID09IGludHMkdmFyc1tqXSAmIG5ld2RhdCR0ZW1wdHJlbmQgPiAwICYgbmV3ZGF0JFJFQUxNMiA9PSBpbnRzJFJFQUxNMltqXQogICAgdGl0bGUgPC0gcGFzdGUwKCdodW1hbjonLCBpbnRzJFJFQUxNMltqXSkKICB9IAoKICB0aGlzcGxvdCA8LSBnZ3Bsb3QobmV3ZGF0W3N1YnMsIF0sIAogICAgICAgICAgICAgICAgICAgICBhZXNfc3RyaW5nKHggPSB4dmFyLCB5ID0gJ3ByZWRzJywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAgPSBpbnRzJHZhcnNbal0sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gaW50cyR2YXJzW2pdKSkgKwogICAgZ2VvbV9saW5lKCkgKwogICAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKC0wLjIsIDAuNCkpICsKICAgIHRoZW1lKHBsb3QubWFyZ2luID0gdW5pdChjKDAuNSwwLDAuNSwwKSwgJ2NtJykpICsKICAgIGxhYnModGl0bGUgPSB0aXRsZSkKICBpZihpbnRzJGxvZ1tqXSAmICFpbnRzJGRpc2NyZXRlW2pdKXsKICAgIGludHBsb3RzW1tqXV0gPC0gdGhpc3Bsb3QgKyBzY2FsZV9jb2xvcl9kaXN0aWxsZXIocGFsZXR0ZSA9ICJZbEduQnUiLCB0cmFucyA9ICdsb2cnKQogIH0KICBpZighaW50cyRsb2dbal0gJiAhaW50cyRkaXNjcmV0ZVtqXSl7CiAgICBpbnRwbG90c1tbal1dIDwtIHRoaXNwbG90ICsgc2NhbGVfY29sb3JfZGlzdGlsbGVyKHBhbGV0dGUgPSAiWWxHbkJ1IiwgdHJhbnMgPSAnaWRlbnRpdHknKQogIH0KICBpZihpbnRzJGRpc2NyZXRlW2pdKXsKICAgIGludHBsb3RzW1tqXV0gPC0gdGhpc3Bsb3QgKyBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpCiAgfQp9CgojZ3JpZC5hcnJhbmdlKGdyb2JzID0gaW50cGxvdHMsICcrJywgdGhlbWUocGxvdC5tYXJnaW4gPSB1bml0KGMoMCwwLDAsMCksICdjbScpKSksIG5jb2w9MikKI2RvLmNhbGwoJ2dyaWQuYXJyYW5nZScsIGMoaW50cGxvdHMsIG5jb2wgPSAyKSkKZ3JpZC5hcnJhbmdlKGdyb2JzID0gaW50cGxvdHMsIG5jb2wgPSAzKQoKIyB3cml0ZSBvdXQgdGhlIGludGVyYWN0aW9ucwp3cml0ZS5jc3YobmV3ZGF0LCBmaWxlID0gJ3RlbXAvaW50ZXJhY3Rpb25zLmNzdicpCgpgYGAKCiMjIyMgUGxvdCByZXNpZHVhbHMgYWdhaW5zdCBlYWNoIHByZWRpY3RvciAoSmFjY2FyZCB0dXJub3ZlcikKYGBge3IgcmVzaWRzIG1vZFRmdWxsMSwgZmlnLmhlaWdodCA9IDEwLCBmaWcud2lkdGg9MTB9CnJlc2lkcyA8LSByZXNpZChtb2RUZnVsbEp0dXJlbTApCnByZWRzIDwtIGdldERhdGEobW9kVGZ1bGxKdHVyZW0wKQpjb2wgPSAnIzAwMDAwMDMzJwpjZXggPSAwLjUKcGFyKG1mcm93ID0gYyg1LDQpKQpib3hwbG90KHJlc2lkcyB+IHByZWRzJFJFQUxNLCBjZXggPSBjZXgsIGNvbCA9IGNvbCkKcGxvdChwcmVkcyR0ZW1wdHJlbmRfYWJzLnNjLCByZXNpZHMsIGNleCA9IGNleCwgY29sID0gY29sKQpwbG90KHByZWRzJHRzaWduLCByZXNpZHMsIGNleCA9IGNleCwgY29sID0gY29sKQpwbG90KHByZWRzJHRlbXBhdmUuc2MsIHJlc2lkcywgY2V4ID0gY2V4LCBjb2wgPSBjb2wpCnBsb3QocHJlZHMkdGVtcGF2ZV9tZXRhYi5zYywgcmVzaWRzLCBjZXggPSBjZXgsIGNvbCA9IGNvbCkKcGxvdChwcmVkcyRzZWFzLnNjLCByZXNpZHMsIGNleCA9IGNleCwgY29sID0gY29sKQpwbG90KHByZWRzJG1pY3JvY2xpbS5zYywgcmVzaWRzLCBjZXggPSBjZXgsIGNvbCA9IGNvbCkKcGxvdChwcmVkcyRtYXNzLnNjLCByZXNpZHMsIGNleCA9IGNleCwgY29sID0gY29sKQpwbG90KHByZWRzJHNwZWVkLnNjLCByZXNpZHMsIGNleCA9IGNleCwgY29sID0gY29sKQpwbG90KHByZWRzJGxpZmVzcGFuLnNjLCByZXNpZHMsIGNleCA9IGNleCwgY29sID0gY29sKQpwbG90KHByZWRzJGNvbnN1bWVyZnJhYy5zYywgcmVzaWRzLCBjZXggPSBjZXgsIGNvbCA9IGNvbCkKcGxvdChwcmVkcyRlbmRvdGhlcm1mcmFjLnNjLCByZXNpZHMsIGNleCA9IGNleCwgY29sID0gY29sKQpwbG90KHByZWRzJG5zcHAuc2MsIHJlc2lkcywgY2V4ID0gY2V4LCBjb2wgPSBjb2wpCnBsb3QocHJlZHMkdGhlcm1hbF9iaWFzLnNjLCByZXNpZHMsIGNleCA9IGNleCwgY29sID0gY29sKQpwbG90KHByZWRzJG5wcC5zYywgcmVzaWRzLCBjZXggPSBjZXgsIGNvbCA9IGNvbCkKcGxvdChwcmVkcyR2ZWcuc2MsIHJlc2lkcywgY2V4ID0gY2V4LCBjb2wgPSBjb2wpCnBsb3QocHJlZHMkaHVtYW5fYm93bGVyLnNjLCByZXNpZHMsIGNleCA9IGNleCwgY29sID0gY29sKQpgYGAKCiMjIyBSZW1vdmUgZWFjaCB0ZXJtIGZyb20gdGhlIGZ1bGwgbW9kZWwKYGBge3IgdGVybSBkZWxldGlvbiBmcm9tIG1vZFRmdWxsfQpBSUNuYXMgPC0gZnVuY3Rpb24oeCl7CiAgaWYoY2xhc3MoeCkgPT0gJ05VTEwnKXsKICAgIHJldHVybihOQSkKICB9IGVsc2UgewogICAgcmV0dXJuKEFJQyh4KSkKICB9Cn0KCmlmKGZpbGUuZXhpc3RzKCdvdXRwdXQvYWljc19mcm9tX2Z1bGwuY3N2JykpewogIGFpY3Nmcm9tZnVsbCA8LSByZWFkLmNzdignb3V0cHV0L2FpY3NfZnJvbV9mdWxsLmNzdicpCiAgCiAgaWYoJ2RBSUNfSnR1JyAlaW4lIGNvbG5hbWVzKGFpY3Nmcm9tZnVsbCkpewogICAgcnVuSnR1IDwtIEZBTFNFCiAgfSBlbHNlIHsKICAgIHJ1bkp0dSA8LSBUUlVFCiAgfQogIAogIGlmKCdkQUlDX0piZXRhJyAlaW4lIGNvbG5hbWVzKGFpY3Nmcm9tZnVsbCkpewogICAgcnVuSmJldGEgPC0gRkFMU0UKICB9IGVsc2UgewogICAgcnVuSmJldGEgPC0gVFJVRQogIH0KICAKICBpZignZEFJQ19Ib3JuJyAlaW4lIGNvbG5hbWVzKGFpY3Nmcm9tZnVsbCkpewogICAgcnVuSG9ybiA8LSBGQUxTRQogIH0gZWxzZSB7CiAgICBydW5Ib3JuIDwtIFRSVUUKICB9CiAgCn0gZWxzZSB7CiAgcnVuSnR1IDwtIFRSVUUKICBydW5KYmV0YSA8LSBUUlVFCiAgcnVuSG9ybiA8LSBUUlVFCn0KCnJhbmRlZiA8LSBsaXN0KFNUVURZX0lEID0gfiB0ZW1wdHJlbmRfYWJzLnNjLCByYXJlZnlJRCA9IH4xKQp2YXJlZiA8LSB2YXJQb3dlcigtMC41LCB+bnlyQlQpCgp0ZXJtcyA8LSBjKCd0ZW1wdHJlbmRfYWJzLnNjKlJFQUxNJywgCiAgICAgICAgICAgJ3RlbXB0cmVuZF9hYnMuc2MqdHNpZ24nLAogICAgICAgICAgICd0ZW1wdHJlbmRfYWJzLnNjKnRlbXBhdmVfbWV0YWIuc2MnLAogICAgICAgICAgICd0ZW1wdHJlbmRfYWJzLnNjKnNlYXMuc2MnLAogICAgICAgICAgICd0ZW1wdHJlbmRfYWJzLnNjKm1pY3JvY2xpbS5zYycsCiAgICAgICAgICAgJ3RlbXB0cmVuZF9hYnMuc2MqbWFzcy5zYycsCiAgICAgICAgICAgJ3RlbXB0cmVuZF9hYnMuc2Mqc3BlZWQuc2MnLCAKICAgICAgICAgICAndGVtcHRyZW5kX2Ficy5zYypjb25zdW1lcmZyYWMuc2MnLAogICAgICAgICAgICd0ZW1wdHJlbmRfYWJzLnNjKm5zcHAuc2MnLAogICAgICAgICAgICd0ZW1wdHJlbmRfYWJzLnNjKnRoZXJtYWxfYmlhcy5zYzp0c2lnbicsCiAgICAgICAgICAgJ3RlbXB0cmVuZF9hYnMuc2MqbnBwLnNjJywKICAgICAgICAgICAndGVtcHRyZW5kX2Ficy5zYyp2ZWcuc2MnLAogICAgICAgICAgICd0ZW1wdHJlbmRfYWJzLnNjKmR1cmF0aW9uLnNjJywKICAgICAgICAgICAndGVtcHRyZW5kX2Ficy5zYypodW1hbl9ib3dsZXIuc2M6UkVBTE0yJykKCgppZihydW5KdHUpewogIGkgPC0gdHJlbmRzWywgY29tcGxldGUuY2FzZXMoSnR1dHJlbmRyZW0wLCBSRUFMTSwgdGVtcGF2ZV9tZXRhYi5zYywgc2Vhcy5zYywgbWljcm9jbGltLnNjLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MsIG1hc3Muc2MsIHNwZWVkLnNjLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN1bWVyZnJhYy5zYywgbnNwcC5zYywgdGhlcm1hbF9iaWFzLnNjLCBucHAuc2MsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVnLnNjLCBkdXJhdGlvbi5zYywgaHVtYW5fYm93bGVyLnNjKV0KICAKICBtb2RUZHJvcHMgPC0gdmVjdG9yKCdsaXN0JywgbGVuZ3RoKHRlcm1zKSsyKQogIG5hbWVzKG1vZFRkcm9wcykgPC0gYygnZnVsbCcsICctdGVtcHRyZW5kX2Ficy5zYycsIHBhc3RlMCgnLScsIHRlcm1zKSkKICAKICAjIGZpdCBmdWxsIG1vZGVsIHdpdGggTUwgZm9yIG1vZGVsIGNvbXBhcmlzb24KICBtb2RUZHJvcHNbWzFdXSA8LSBsbWUoZm9ybXVsYShwYXN0ZTAoJ0p0dXRyZW5kcmVtMCB+ICcsIHBhc3RlKHRlcm1zLCBjb2xsYXBzZSA9ICcgKyAnKSkpLAogICAgICAgICAgICAgICAgICAgICAgICByYW5kb20gPSByYW5kZWYsIHdlaWdodHMgPSB2YXJlZiwgZGF0YSA9IHRyZW5kc1tpLF0sIG1ldGhvZCA9ICdNTCcpCiAgCiAgIyB3L291dCB0ZW1wdHJlbmQKICBtb2RUZHJvcHNbWzJdXSA8LSBsbWUoZm9ybXVsYShwYXN0ZTAoJ0p0dXRyZW5kcmVtMCB+ICcsIHBhc3RlKGdzdWIoJ3RlbXB0cmVuZF9hYnMuc2NcXConLCAnJywgdGVybXMpLCBjb2xsYXBzZSA9ICcgKyAnKSkpLAogICAgICAgICAgICAgICAgICAgICAgICByYW5kb20gPSBsaXN0KFNUVURZX0lEID0gfiAxLCByYXJlZnlJRCA9IH4xKSwgd2VpZ2h0cyA9IHZhcmVmLCBkYXRhID0gdHJlbmRzW2ksXSwgbWV0aG9kID0gJ01MJykKICAKICBmb3IoaiBpbiAxOmxlbmd0aCh0ZXJtcykpewogICAgcHJpbnQoaikKICAgIHRyeUNhdGNoKHsKICAgICAgbW9kVGRyb3BzW1tqKzJdXSA8LSBsbWUoZm9ybXVsYShwYXN0ZTAoJ0p0dXRyZW5kcmVtMCB+ICcsIHBhc3RlKHRlcm1zWy1qXSwgY29sbGFwc2UgPSAnICsgJykpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZG9tID0gcmFuZGVmLCB3ZWlnaHRzID0gdmFyZWYsIGRhdGEgPSB0cmVuZHNbaSxdLCBtZXRob2QgPSAnTUwnKQogICAgICAKICAgIH0sIGVycm9yID0gZnVuY3Rpb24oZSl7CiAgICAgIHByaW50KCdnb2luZyB0byBvcHRpbSAoSnR1KScpCiAgICAgIHRyeUNhdGNoKHsKICAgICAgICBtb2RUZHJvcHNbW2orMl1dIDwtIGxtZShmb3JtdWxhKHBhc3RlMCgnSnR1dHJlbmRyZW0wIH4gJywgcGFzdGUodGVybXNbLWpdLCBjb2xsYXBzZSA9ICcgKyAnKSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbSA9IHJhbmRlZiwgd2VpZ2h0cyA9IHZhcmVmLCBkYXRhID0gdHJlbmRzW2ksXSwgbWV0aG9kID0gJ01MJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sID0gbG1lQ29udHJvbChvcHQgPSAnb3B0aW0nKSkKICAgICAgICAKICAgICAgfSwgZXJyb3IgPSBmdW5jdGlvbihlKXsKICAgICAgICBwcmludCgnZ29pbmcgdG8gbW9yZSBpdGVycyAoSnR1KScpIAogICAgICAgIHRyeUNhdGNoKHsKICAgICAgICAgIG1vZFRkcm9wc1tbaisyXV0gPC0gbG1lKGZvcm11bGEocGFzdGUwKCdKdHV0cmVuZHJlbTAgfiAnLCBwYXN0ZSh0ZXJtc1stal0sIGNvbGxhcHNlID0gJyArICcpKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5kb20gPSByYW5kZWYsIHdlaWdodHMgPSB2YXJlZiwgZGF0YSA9IHRyZW5kc1tpLF0sIG1ldGhvZCA9ICdNTCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sID0gbG1lQ29udHJvbChtYXhJdGVyID0gMTAwLCBtc01heEl0ZXIgPSAxMDAsIG5pdGVyRU0gPSA1MCwgbXNNYXhFdmFsID0gNTAwKSkKICAgICAgICAgIAogICAgICAgIH0sIGVycm9yPSBmdW5jdGlvbihlKXsKICAgICAgICAgIHByaW50KCdnaXZpbmcgdXAgb24gdGhpcyBvbmUnKQogICAgICAgICAgbW9kVGRyb3BzW1tqKzJdXSA8LSBOQQogICAgICAgIH0pCiAgICAgIH0pCiAgICB9KQogIH0KICAKICBhaWNzSnR1IDwtIHNhcHBseShtb2RUZHJvcHMsIEFJQ25hcykKfQoKCmlmKHJ1bkpiZXRhKXsKICBpIDwtIHRyZW5kc1ssIGNvbXBsZXRlLmNhc2VzKEpiZXRhdHJlbmRyZW0wLCBSRUFMTSwgdGVtcGF2ZV9tZXRhYi5zYywgc2Vhcy5zYywgbWljcm9jbGltLnNjLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MsIG1hc3Muc2MsIHNwZWVkLnNjLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN1bWVyZnJhYy5zYywgbnNwcC5zYywgdGhlcm1hbF9iaWFzLnNjLCBucHAuc2MsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVnLnNjLCBkdXJhdGlvbi5zYywgaHVtYW5fYm93bGVyLnNjKV0KICAKICBtb2RUSmJldGFkcm9wcyA8LSB2ZWN0b3IoJ2xpc3QnLCBsZW5ndGgodGVybXMpKzIpCiAgbmFtZXMobW9kVEpiZXRhZHJvcHMpIDwtIGMoJ2Z1bGwnLCAnLXRlbXB0cmVuZF9hYnMuc2MnLCBwYXN0ZTAoJy0nLCB0ZXJtcykpCiAgCiAgIyBmaXQgZnVsbCBtb2RlbCB3aXRoIE1MIGZvciBtb2RlbCBjb21wYXJpc29uCiAgbW9kVEpiZXRhZHJvcHNbWzFdXSA8LSBsbWUoZm9ybXVsYShwYXN0ZTAoJ0piZXRhdHJlbmRyZW0wIH4gJywgcGFzdGUodGVybXMsIGNvbGxhcHNlID0gJyArICcpKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZG9tID0gcmFuZGVmLCB3ZWlnaHRzID0gdmFyZWYsIGRhdGEgPSB0cmVuZHNbaSxdLCBtZXRob2QgPSAnTUwnKQogIAogICMgdy9vdXQgdGVtcHRyZW5kCiAgbW9kVEpiZXRhZHJvcHNbWzJdXSA8LSBsbWUoZm9ybXVsYShwYXN0ZTAoJ0piZXRhdHJlbmRyZW0wIH4gJywgcGFzdGUoZ3N1YigndGVtcHRyZW5kX2Ficy5zY1xcKicsICcnLCB0ZXJtcyksIGNvbGxhcHNlID0gJyArICcpKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZG9tID0gbGlzdChTVFVEWV9JRCA9IH4gMSwgcmFyZWZ5SUQgPSB+MSksIHdlaWdodHMgPSB2YXJlZiwgZGF0YSA9IHRyZW5kc1tpLF0sIG1ldGhvZCA9ICdNTCcpCiAgCiAgZm9yKGogaW4gMTpsZW5ndGgodGVybXMpKXsKICAgIHByaW50KGopCiAgICB0cnlDYXRjaCh7CiAgICAgIG1vZFRKYmV0YWRyb3BzW1tqKzJdXSA8LSBsbWUoZm9ybXVsYShwYXN0ZTAoJ0piZXRhdHJlbmRyZW0wIH4gJywgcGFzdGUodGVybXNbLWpdLCBjb2xsYXBzZSA9ICcgKyAnKSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbSA9IHJhbmRlZiwgd2VpZ2h0cyA9IHZhcmVmLCBkYXRhID0gdHJlbmRzW2ksXSwgbWV0aG9kID0gJ01MJykKICAgIH0sIGVycm9yID0gZnVuY3Rpb24oZSl7CiAgICAgIHByaW50KCdnb2luZyB0byBvcHRpbSAoSmJldGEpJykKICAgICAgdHJ5Q2F0Y2goewogICAgICAgIG1vZFRKYmV0YWRyb3BzW1tqKzJdXSA8LSBsbWUoZm9ybXVsYShwYXN0ZTAoJ0piZXRhdHJlbmRyZW0wIH4gJywgcGFzdGUodGVybXNbLWpdLCBjb2xsYXBzZSA9ICcgKyAnKSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZG9tID0gcmFuZGVmLCB3ZWlnaHRzID0gdmFyZWYsIGRhdGEgPSB0cmVuZHNbaSxdLCBtZXRob2QgPSAnTUwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbCA9IGxtZUNvbnRyb2wob3B0ID0gJ29wdGltJykpCiAgICAgICAgCiAgICAgIH0sIGVycm9yID0gZnVuY3Rpb24oZSl7CiAgICAgICAgcHJpbnQoJ2dvaW5nIHRvIG1vcmUgaXRlcnMgKEpiZXRhKScpIAogICAgICAgIHRyeUNhdGNoKHsKICAgICAgICAgIG1vZFRKYmV0YWRyb3BzW1tqKzJdXSA8LSBsbWUoZm9ybXVsYShwYXN0ZTAoJ0piZXRhdHJlbmRyZW0wIH4gJywgcGFzdGUodGVybXNbLWpdLCBjb2xsYXBzZSA9ICcgKyAnKSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5kb20gPSByYW5kZWYsIHdlaWdodHMgPSB2YXJlZiwgZGF0YSA9IHRyZW5kc1tpLF0sIG1ldGhvZCA9ICdNTCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgPSBsbWVDb250cm9sKG1heEl0ZXIgPSAxMDAsIG1zTWF4SXRlciA9IDEwMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5pdGVyRU0gPSA1MCwgbXNNYXhFdmFsID0gNTAwKSkKICAgICAgICB9LCBlcnJvcj0gZnVuY3Rpb24oZSl7CiAgICAgICAgICBwcmludCgnZ2l2aW5nIHVwIG9uIHRoaXMgb25lIChKYmV0YSknKQogICAgICAgICAgbW9kVEpiZXRhZHJvcHNbW2orMl1dIDwtIE5BCiAgICAgICAgfSkKICAgICAgfQogICAgICApCiAgICB9CiAgICApCiAgfQogIGFpY3NKYmV0YSA8LSBzYXBwbHkobW9kVEpiZXRhZHJvcHMsIEFJQ25hcykKfQoKaWYocnVuSG9ybil7CiAgaTIgPC0gdHJlbmRzWywgY29tcGxldGUuY2FzZXMoSG9ybnRyZW5kcmVtMCwgUkVBTE0sIHRlbXBhdmVfbWV0YWIuc2MsIHNlYXMuc2MsIG1pY3JvY2xpbS5zYywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYywgbWFzcy5zYywgc3BlZWQuc2MsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN1bWVyZnJhYy5zYywgbnNwcC5zYywgdGhlcm1hbF9iaWFzLnNjLCBucHAuc2MsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlZy5zYywgZHVyYXRpb24uc2MsIGh1bWFuX2Jvd2xlci5zYyldCiAgCiAgbW9kVEhvcm5kcm9wcyA8LSB2ZWN0b3IoJ2xpc3QnLCBsZW5ndGgodGVybXMpKzIpCiAgbmFtZXMobW9kVEhvcm5kcm9wcykgPC0gYygnZnVsbCcsICctdGVtcHRyZW5kX2Ficy5zYycsIHBhc3RlMCgnLScsIHRlcm1zKSkKICBtb2RUSG9ybmRyb3BzW1sxXV0gPC0gbG1lKGZvcm11bGEocGFzdGUwKCdIb3JudHJlbmRyZW0wIH4gJywgcGFzdGUodGVybXMsIGNvbGxhcHNlID0gJyArICcpKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5kb20gPSByYW5kZWYsIHdlaWdodHMgPSB2YXJlZiwgZGF0YSA9IHRyZW5kc1tpMixdLCBtZXRob2QgPSAnTUwnKQogIG1vZFRIb3JuZHJvcHNbWzJdXSA8LSBsbWUoZm9ybXVsYShwYXN0ZTAoJ0hvcm50cmVuZHJlbTAgfiAnLCBwYXN0ZShnc3ViKCd0ZW1wdHJlbmRfYWJzLnNjXFwqJywgJycsIHRlcm1zKSwgY29sbGFwc2UgPSAnICsgJykpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbSA9IGxpc3QoU1RVRFlfSUQgPSB+IDEsIHJhcmVmeUlEID0gfjEpLCB3ZWlnaHRzID0gdmFyZWYsIGRhdGEgPSB0cmVuZHNbaTIsXSwgbWV0aG9kID0gJ01MJykKICAKICBmb3IoaiBpbiAxOmxlbmd0aCh0ZXJtcykpewogICAgcHJpbnQoaikKICAgIHRyeUNhdGNoKHsKICAgICAgbW9kVEhvcm5kcm9wc1tbaisyXV0gPC0gbG1lKGZvcm11bGEocGFzdGUwKCdIb3JudHJlbmRyZW0wIH4gJywgcGFzdGUodGVybXNbLWpdLCBjb2xsYXBzZSA9ICcgKyAnKSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZG9tID0gcmFuZGVmLCB3ZWlnaHRzID0gdmFyZWYsIGRhdGEgPSB0cmVuZHNbaTIsXSwgbWV0aG9kID0gJ01MJykKICAgIH0sIGVycm9yID0gZnVuY3Rpb24oZSl7CiAgICAgIHByaW50KCdnb2luZyB0byBvcHRpbSAoSG9ybiknKQogICAgICB0cnlDYXRjaCh7CiAgICAgICAgbW9kVEhvcm5kcm9wc1tbaisyXV0gPC0gbG1lKGZvcm11bGEocGFzdGUwKCdIb3JudHJlbmRyZW0wIH4gJywgcGFzdGUodGVybXNbLWpdLCBjb2xsYXBzZSA9ICcgKyAnKSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5kb20gPSByYW5kZWYsIHdlaWdodHMgPSB2YXJlZiwgZGF0YSA9IHRyZW5kc1tpMixdLCBtZXRob2QgPSAnTUwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sID0gbG1lQ29udHJvbChvcHQgPSAnb3B0aW0nKSkKICAgICAgICAKICAgICAgfSwgZXJyb3IgPSBmdW5jdGlvbihlKXsKICAgICAgICBwcmludCgnZ29pbmcgdG8gbW9yZSBpdGVycyAoSG9ybiknKSAKICAgICAgICB0cnlDYXRjaCh7CiAgICAgICAgICBtb2RUSG9ybmRyb3BzW1tqKzJdXSA8LSBsbWUoZm9ybXVsYShwYXN0ZTAoJ0hvcm50cmVuZHJlbTAgfiAnLCBwYXN0ZSh0ZXJtc1stal0sIGNvbGxhcHNlID0gJyArICcpKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZG9tID0gcmFuZGVmLCB3ZWlnaHRzID0gdmFyZWYsIGRhdGEgPSB0cmVuZHNbaTIsXSwgbWV0aG9kID0gJ01MJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sID0gbG1lQ29udHJvbChtYXhJdGVyID0gMTAwLCBtc01heEl0ZXIgPSAxMDAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5pdGVyRU0gPSA1MCwgbXNNYXhFdmFsID0gNTAwKSkKICAgICAgICAgIAogICAgICAgIH0sIGVycm9yPSBmdW5jdGlvbihlKXsKICAgICAgICAgIHByaW50KCdnaXZpbmcgdXAgb24gdGhpcyBvbmUgKEhvcm4pJykKICAgICAgICAgIG1vZFRIb3JuZHJvcHNbW2orMl1dIDwtIE5BCiAgICAgICAgfSkKICAgICAgfSkKICAgIH0pCiAgfQogIGFpY3NIb3JuIDwtIHNhcHBseShtb2RUSG9ybmRyb3BzLCBBSUNuYXMpCn0KCiMgaWYgdGhlcmUgd2FzIGFueXRoaW5nIG5ldwppZihydW5KdHUgfCBydW5KYmV0YSB8IHJ1bkhvcm4pewogIGlmKCFleGlzdHMoJ2FpY3Nmcm9tZnVsbCcpKXsKICAgIGFpY3Nmcm9tZnVsbCA8LSBkYXRhLmZyYW1lKG1vZCA9IG5hbWVzKGFpY3NKdHUpKQogIH0KICAKICAjIHN1YnRyYWN0IGZ1bGwgZnJvbSBlYWNoIG1vZGVsIEFJQy4gTmVnYXRpdmUgbWVhbnMgdGVybSByZW1vdmFsIGlzIHN1cHBvcnRlZC4gUG9zaXRpdmUgbWVhbnMgZnVsbCBpcyB0aGUgYmV0dGVyIG1vZGVsLgogIGlmKHJ1bkp0dSl7CiAgICBhaWNzZnJvbWZ1bGwkZEFJQ19KdHUgPC0gYWljc0p0dSAtIGFpY3NKdHVbMV0KICB9CiAgaWYocnVuSmJldGEpewogICAgYWljc2Zyb21mdWxsJGRBSUNfSmJldGEgPC0gYWljc0piZXRhIC0gYWljc0piZXRhWzFdCiAgfQogIGlmKHJ1bkhvcm4pewogICAgYWljc2Zyb21mdWxsJGRBSUNfSG9ybiA8LSBhaWNzSG9ybiAtIGFpY3NIb3JuWzFdCiAgfQogIAogICMgd3JpdGUgb3V0CiAgd3JpdGUuY3N2KGFpY3Nmcm9tZnVsbCwgZmlsZSA9ICdvdXRwdXQvYWljc19mcm9tX2Z1bGwuY3N2Jywgcm93Lm5hbWVzID0gRkFMU0UpCn0KCmFpY3Nmcm9tZnVsbApgYGAKCiMjIyMgUGxvdCBkZWx0YUFJQ3MgZm9yIGFsbCAzIG1vZGVscwpgYGB7ciBwbG90IGRBSUNzfQojIHRyYW5zZm9ybSBmb3IgYSBwbG90CmFpY3Nmcm9tZnVsbGxvbmcgPC0gcmVzaGFwZShhaWNzZnJvbWZ1bGwsIGRpcmVjdGlvbiA9ICdsb25nJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcnlpbmcgPSBjKCdkQUlDX0p0dScsICdkQUlDX0piZXRhJywgJ2RBSUNfSG9ybicpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdi5uYW1lcyA9ICdkQUlDJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkdmFyID0gJ21vZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1ldmFyID0gJ3R5cGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXMgPSBjKCdKdHUnLCAnSmJldGEnLCAnSG9ybicpKQoKdHJhbnMgPSBmdW5jdGlvbih4KSBzaWduKHgpKnNxcnQoYWJzKHgpKQphaWNzZnJvbWZ1bGxsb25nJGRBSUNfdHIgPC0gdHJhbnMoYWljc2Zyb21mdWxsbG9uZyRkQUlDKQoKIyBwbG90CnhsaW1zIDwtIHJhbmdlKGFpY3Nmcm9tZnVsbGxvbmckZEFJQ190ciwgbmEucm0gPSBUUlVFKQp4dGlja3MgPC0gYygtMTAsIDAsIDEwLCAxMDAsIDEwMDAsIDEwMDAwKQpwYXIobWFpID0gYygwLjUsIDMsIDAuMSwgMC4xKSkKd2l0aChhaWNzZnJvbWZ1bGxsb25nW2FpY3Nmcm9tZnVsbGxvbmckdHlwZSA9PSAnSnR1JyxdLCBwbG90KGRBSUNfdHIsIG5yb3coYWljc2Zyb21mdWxsKToxLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2wgPSAnbGlnaHQgZ3JleScsIHhsaW0gPSB4bGltcywgeWF4dCA9ICduJywgeWxhYiA9ICcnLCB4YXh0ID0gJ24nKSkKd2l0aChhaWNzZnJvbWZ1bGxsb25nW2FpY3Nmcm9tZnVsbGxvbmckdHlwZSA9PSAnSmJldGEnLF0sIHBvaW50cyhkQUlDX3RyLCBucm93KGFpY3Nmcm9tZnVsbCk6MSAtIDAuMSwgY29sID0gJ2RhcmsgZ3JleScpKQp3aXRoKGFpY3Nmcm9tZnVsbGxvbmdbYWljc2Zyb21mdWxsbG9uZyR0eXBlID09ICdIb3JuJyxdLCBwb2ludHMoZEFJQ190ciwgbnJvdyhhaWNzZnJvbWZ1bGwpOjEgLSAwLjIsIGNvbCA9ICdibGFjaycpKQpheGlzKDIsIGF0ID0gbnJvdyhhaWNzZnJvbWZ1bGwpOjEsIGxhYmVscyA9IGFpY3Nmcm9tZnVsbCRtb2QsIGxhcyA9IDEsIGNleC5heGlzID0gMC43KQpheGlzKDEsIGF0ID0gdHJhbnMoeHRpY2tzKSwgbGFiZWxzID0geHRpY2tzLCBjZXguYXhpcyA9IDAuNSkKYWJsaW5lKHYgPSAwLCBsdHkgPTIsIGNvbCA9ICdncmV5JykKYGBgCgpMaWdodCBncmV5IGlzIGZvciBKYWNjYXJkIHR1cm5vdmVyLCBkYXJrIGdyZXkgaXMgZm9yIEphY2NhcmQgdG90YWwsIGJsYWNrIGlzIGZvciBNb3Jpc2l0YS1Ib3JuLgpDbGVhciB0aGF0IHJlbW92aW5nIHRlbXBlcmF0dXJlIHRyZW5kIG1ha2VzIHRoZSBtb2RlbCBxdWl0ZSBhIGJpdCB3b3JzZSBhbmQgaGFzIHRoZSBiaWdnZXN0IGVmZmVjdC4KCgoKIyMgU2ltcGxpZnkgdGhlIGZ1bGwgbW9kZWxzClRoaXMgdGFrZXMgYSBjb3VwbGUgZGF5cyBvbiBhIGxhcHRvcCB0byBydW4gaWYgdGVtcC8gZmlsZXMgbm90IGF2YWlsYWJsZS4KYGBge3Igc2ltcGxpZnkgdGhlIGZ1bGwgbW9kZWxzfQppMSA8LSB0cmVuZHNbLCBjb21wbGV0ZS5jYXNlcyhKdHV0cmVuZHJlbTAsIFJFQUxNLCB0ZW1wYXZlX21ldGFiLnNjLCBzZWFzLnNjLCBtaWNyb2NsaW0uc2MsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MsIG1hc3Muc2MsIHNwZWVkLnNjLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdW1lcmZyYWMuc2MsIG5zcHAuc2MsIHRoZXJtYWxfYmlhcy5zYywgbnBwLnNjLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWcuc2MsIGR1cmF0aW9uLnNjLCBodW1hbl9ib3dsZXIuc2MpXQppMiA8LSB0cmVuZHNbLCBjb21wbGV0ZS5jYXNlcyhKYmV0YXRyZW5kcmVtMCwgUkVBTE0sIHRlbXBhdmVfbWV0YWIuc2MsIHNlYXMuc2MsIG1pY3JvY2xpbS5zYywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYywgbWFzcy5zYywgc3BlZWQuc2MsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN1bWVyZnJhYy5zYywgbnNwcC5zYywgdGhlcm1hbF9iaWFzLnNjLCBucHAuc2MsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlZy5zYywgZHVyYXRpb24uc2MsIGh1bWFuX2Jvd2xlci5zYyldCmkzIDwtIHRyZW5kc1ssIGNvbXBsZXRlLmNhc2VzKEhvcm50cmVuZHJlbTAsIFJFQUxNLCB0ZW1wYXZlX21ldGFiLnNjLCBzZWFzLnNjLCBtaWNyb2NsaW0uc2MsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MsIG1hc3Muc2MsIHNwZWVkLnNjLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdW1lcmZyYWMuc2MsIG5zcHAuc2MsIHRoZXJtYWxfYmlhcy5zYywgbnBwLnNjLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWcuc2MsIGR1cmF0aW9uLnNjLCBodW1hbl9ib3dsZXIuc2MpXQoKcmFuZGVmIDwtIGxpc3QoU1RVRFlfSUQgPSB+IHRlbXB0cmVuZF9hYnMuc2MsIHJhcmVmeUlEID0gfjEpCnZhcmVmIDwtIHZhclBvd2VyKC0wLjUsIH5ueXJCVCkKCiMgc2ltcGxpZnkgdGhlIGZ1bGwgbW9kZWxzCmlmKGZpbGUuZXhpc3RzKCd0ZW1wL21vZFRzaW1wSnR1cmVtMC5yZHMnKSl7CiAgbW9kVHNpbXBKdHVyZW0wIDwtIHJlYWRSRFMoJ3RlbXAvbW9kVHNpbXBKdHVyZW0wLnJkcycpCn0gZWxzZSB7CiAgbW9kVGZ1bGxKdHVyZW0wTUwgPC0gbG1lKEp0dXRyZW5kcmVtMCB+IHRlbXB0cmVuZF9hYnMuc2MqUkVBTE0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqdHNpZ24gKwogICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYyp0ZW1wYXZlX21ldGFiLnNjICsgCiAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKnNlYXMuc2MgKyAKICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqbWljcm9jbGltLnNjICsgCiAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKm1hc3Muc2MgKyAKICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2Mqc3BlZWQuc2MgKyAKICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqY29uc3VtZXJmcmFjLnNjICsKICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqbnNwcC5zYyArCiAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKnRoZXJtYWxfYmlhcy5zYzp0c2lnbiArCiAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKm5wcC5zYyArCiAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKnZlZy5zYyArCiAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKmR1cmF0aW9uLnNjICsKICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqaHVtYW5fYm93bGVyLnNjOlJFQUxNMiwKICAgICAgICAgICAgICAgICAgICAgICByYW5kb20gPSByYW5kZWYsIHdlaWdodHMgPSB2YXJlZiwgZGF0YSA9IHRyZW5kc1tpMSxdLCBtZXRob2QgPSAnTUwnLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgPSBsbWVDb250cm9sKG1heEl0ZXIgPSAxMDAsIG1zTWF4SXRlciA9IDEwMCwgbml0ZXJFTSA9IDUwLCBtc01heEV2YWwgPSA1MDApKQogIG1vZFRzaW1wSnR1cmVtMCA8LSBzdGVwQUlDKG1vZFRmdWxsSnR1cmVtME1MLCBkaXJlY3Rpb24gPSAnYmFja3dhcmQnKQogIHNhdmVSRFMobW9kVHNpbXBKdHVyZW0wLCBmaWxlID0gJ3RlbXAvbW9kVHNpbXBKdHVyZW0wLnJkcycpCn0KCmlmKGZpbGUuZXhpc3RzKCd0ZW1wL21vZFRzaW1wSmJldGFyZW0wLnJkcycpKXsKICBtb2RUc2ltcEpiZXRhcmVtMCA8LSByZWFkUkRTKCd0ZW1wL21vZFRzaW1wSmJldGFyZW0wLnJkcycpCn0gZWxzZSB7CiAgbW9kVGZ1bGxKYmV0YXJlbTBNTCA8LSBsbWUoSmJldGF0cmVuZHJlbTAgfiB0ZW1wdHJlbmRfYWJzLnNjKlJFQUxNICsgCiAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKnRzaWduICsKICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqdGVtcGF2ZV9tZXRhYi5zYyArIAogICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYypzZWFzLnNjICsgCiAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKm1pY3JvY2xpbS5zYyArIAogICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYyptYXNzLnNjICsgCiAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKnNwZWVkLnNjICsgCiAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKmNvbnN1bWVyZnJhYy5zYyArCiAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKm5zcHAuc2MgKwogICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYyp0aGVybWFsX2JpYXMuc2M6dHNpZ24gKwogICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYypucHAuc2MgKwogICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYyp2ZWcuc2MgKwogICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYypkdXJhdGlvbi5zYyArCiAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKmh1bWFuX2Jvd2xlci5zYzpSRUFMTTIsCiAgICAgICAgICAgICAgICAgICAgICAgcmFuZG9tID0gcmFuZGVmLCB3ZWlnaHRzID0gdmFyZWYsIGRhdGEgPSB0cmVuZHNbaTIsXSwgbWV0aG9kID0gJ01MJykKICBtb2RUc2ltcEpiZXRhcmVtMCA8LSBzdGVwQUlDKG1vZFRmdWxsSmJldGFyZW0wTUwsIGRpcmVjdGlvbiA9ICdiYWNrd2FyZCcpCiAgc2F2ZVJEUyhtb2RUc2ltcEpiZXRhcmVtMCwgZmlsZSA9ICd0ZW1wL21vZFRzaW1wSmJldGFyZW0wLnJkcycpCn0KCmlmKGZpbGUuZXhpc3RzKCd0ZW1wL21vZFRzaW1wSG9ybnJlbTAucmRzJykpewogIG1vZFRzaW1wSG9ybnJlbTAgPC0gcmVhZFJEUygndGVtcC9tb2RUc2ltcEhvcm5yZW0wLnJkcycpCn0gZWxzZSB7CiAgbW9kVGZ1bGxIb3JucmVtME1MIDwtIGxtZShIb3JudHJlbmRyZW0wIH4gdGVtcHRyZW5kX2Ficy5zYypSRUFMTSArIAogICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKnRzaWduICsKICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYyp0ZW1wYXZlX21ldGFiLnNjICsgCiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2Mqc2Vhcy5zYyArIAogICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKm1pY3JvY2xpbS5zYyArIAogICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKm1hc3Muc2MgKyAKICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYypzcGVlZC5zYyArIAogICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKmNvbnN1bWVyZnJhYy5zYyArCiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqbnNwcC5zYyArCiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqdGhlcm1hbF9iaWFzLnNjOnRzaWduICsKICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYypucHAuc2MgKwogICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKnZlZy5zYyArCiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqZHVyYXRpb24uc2MgKwogICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKmh1bWFuX2Jvd2xlci5zYzpSRUFMTTIsCiAgICAgICAgICAgICAgICAgICAgICByYW5kb20gPSByYW5kZWYsIHdlaWdodHMgPSB2YXJlZiwgZGF0YSA9IHRyZW5kc1tpMyxdLCBtZXRob2QgPSAnTUwnKQogIG1vZFRzaW1wSG9ybnJlbTAgPC0gc3RlcEFJQyhtb2RUZnVsbEhvcm5yZW0wTUwsIGRpcmVjdGlvbiA9ICdiYWNrd2FyZCcpCiAgc2F2ZVJEUyhtb2RUc2ltcEhvcm5yZW0wLCBmaWxlID0gJ3RlbXAvbW9kVHNpbXBIb3JucmVtMC5yZHMnKQp9CgpzdW1tYXJ5KG1vZFRzaW1wSnR1cmVtMCkKc3VtbWFyeShtb2RUc2ltcEpiZXRhcmVtMCkKc3VtbWFyeShtb2RUc2ltcEhvcm5yZW0wKQoKCmBgYAoKCiMjIE1ha2UgcmVhbG0tc3BlY2lmaWMgbW9kZWxzCmBgYHtyIExNRSBIb3JuIG1vZGVscyBieSByZWFsbSwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTh9CmkxIDwtIHRyZW5kc1ssIFJFQUxNID09ICdUZXJyZXN0cmlhbCcgJiBjb21wbGV0ZS5jYXNlcyhIb3JudHJlbmRyZW0wLCB0ZW1wYXZlX21ldGFiLnNjLCBzZWFzLnNjLCBtaWNyb2NsaW0uc2MsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MsIG1hc3Muc2MsIHNwZWVkLnNjLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdW1lcmZyYWMuc2MsIG5zcHAuc2MsIHRoZXJtYWxfYmlhcy5zYywgbnBwLnNjLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWcuc2MsIGR1cmF0aW9uLnNjLCBodW1hbl9ib3dsZXIuc2MpXQppMiA8LSB0cmVuZHNbLCBSRUFMTSA9PSAnRnJlc2h3YXRlcicgJiBjb21wbGV0ZS5jYXNlcyhIb3JudHJlbmRyZW0wLCB0ZW1wYXZlX21ldGFiLnNjLCBzZWFzLnNjLCBtaWNyb2NsaW0uc2MsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MsIG1hc3Muc2MsIHNwZWVkLnNjLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc3BwLnNjLCB0aGVybWFsX2JpYXMuc2MsIG5wcC5zYywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVnLnNjLCBkdXJhdGlvbi5zYywgaHVtYW5fYm93bGVyLnNjKV0gIyBubyBjb25zdW1lcmZyYWMKaTMgPC0gdHJlbmRzWywgUkVBTE0gPT0gJ01hcmluZScgJiBjb21wbGV0ZS5jYXNlcyhIb3JudHJlbmRyZW0wLCB0ZW1wYXZlX21ldGFiLnNjLCBzZWFzLnNjLCBtaWNyb2NsaW0uc2MsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MsIG1hc3Muc2MsIHNwZWVkLnNjLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdW1lcmZyYWMuc2MsIG5zcHAuc2MsIHRoZXJtYWxfYmlhcy5zYywgbnBwLnNjLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbi5zYywgaHVtYW5fYm93bGVyLnNjKV0gIyBubyB2ZWcKCnByaW50KHBhc3RlKCdUZXJyZXN0cmlhbCcsIHN1bShpMSkpKQpwcmludChwYXN0ZSgnRnJlc2h3YXRlcicsIHN1bShpMikpKQpwcmludChwYXN0ZSgnTWFyaW5lJywgc3VtKGkzKSkpCgpyYW5kZWYgPC0gbGlzdChTVFVEWV9JRCA9IH4gdGVtcHRyZW5kX2Ficy5zYywgcmFyZWZ5SUQgPSB+MSkKdmFyZWYgPC0gdmFyUG93ZXIoLTAuNSwgfm55ckJUKQoKIyBsYW5kCmlmKGZpbGUuZXhpc3RzKCd0ZW1wL21vZFRmdWxsSG9yblRlcnIucmRzJykpewogIG1vZFRmdWxsSG9yblRlcnIgPC0gcmVhZFJEUygndGVtcC9tb2RUZnVsbEhvcm5UZXJyLnJkcycpCn0gZWxzZSB7CiAgbW9kVGZ1bGxIb3JuVGVyciA8LSBsbWUoSG9ybnRyZW5kcmVtMCB+IAogICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYyp0c2lnbiArCiAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKnRlbXBhdmVfbWV0YWIuc2MgKyAKICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2Mqc2Vhcy5zYyArIAogICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYyptaWNyb2NsaW0uc2MgKyAKICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqbWFzcy5zYyArIAogICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYypzcGVlZC5zYyArIAogICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYypjb25zdW1lcmZyYWMuc2MgKwogICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYypuc3BwLnNjICsKICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqdGhlcm1hbF9iaWFzLnNjOnRzaWduICsKICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqbnBwLnNjICsKICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqdmVnLnNjICsKICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqZHVyYXRpb24uc2MgKwogICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYypodW1hbl9ib3dsZXIuc2MsCiAgICAgICAgICAgICAgICAgICAgICAgcmFuZG9tID0gcmFuZGVmLCB3ZWlnaHRzID0gdmFyZWYsIGRhdGEgPSB0cmVuZHNbaTEsXSwgbWV0aG9kID0gJ1JFTUwnLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgPSBsbWVDb250cm9sKG1heEl0ZXIgPSAxMDAsIG1zTWF4SXRlciA9IDEwMCwgbml0ZXJFTSA9IDUwLCBtc01heEV2YWwgPSA1MDApKQogIHNhdmVSRFMobW9kVGZ1bGxIb3JuVGVyciwgZmlsZSA9ICd0ZW1wL21vZFRmdWxsSG9yblRlcnIucmRzJykKfQoKIyBmcmVzaHdhdGVyCmlmKGZpbGUuZXhpc3RzKCd0ZW1wL21vZFRmdWxsSG9ybkZyZXNoLnJkcycpKXsKICBtb2RUZnVsbEhvcm5GcmVzaCA8LSByZWFkUkRTKCd0ZW1wL21vZFRmdWxsSG9ybkZyZXNoLnJkcycpCn0gZWxzZSB7CiAgbW9kVGZ1bGxIb3JuRnJlc2ggPC0gbG1lKEhvcm50cmVuZHJlbTAgfiAKICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqdHNpZ24gKwogICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYyp0ZW1wYXZlX21ldGFiLnNjICsgCiAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKnNlYXMuc2MgKyAKICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqbWljcm9jbGltLnNjICsgCiAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKm1hc3Muc2MgKyAKICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2Mqc3BlZWQuc2MgKyAKICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqbnNwcC5zYyArCiAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKnRoZXJtYWxfYmlhcy5zYzp0c2lnbiArCiAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKm5wcC5zYyArCiAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKnZlZy5zYyArCiAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKmR1cmF0aW9uLnNjICsKICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqaHVtYW5fYm93bGVyLnNjLAogICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbSA9IHJhbmRlZiwgd2VpZ2h0cyA9IHZhcmVmLCBkYXRhID0gdHJlbmRzW2kyLF0sIG1ldGhvZCA9ICdSRU1MJykKICBzYXZlUkRTKG1vZFRmdWxsSG9ybkZyZXNoLCBmaWxlID0gJ3RlbXAvbW9kVGZ1bGxIb3JuRnJlc2gucmRzJykKfQoKIyBtYXJpbmUKaWYoZmlsZS5leGlzdHMoJ3RlbXAvbW9kVGZ1bGxIb3JuTWFyLnJkcycpKXsKICBtb2RUZnVsbEhvcm5NYXIgPC0gcmVhZFJEUygndGVtcC9tb2RUZnVsbEhvcm5NYXIucmRzJykKfSBlbHNlIHsKICBtb2RUZnVsbEhvcm5NYXIgPC0gbG1lKEhvcm50cmVuZHJlbTAgfiAKICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqdHNpZ24gKwogICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYyp0ZW1wYXZlX21ldGFiLnNjICsgCiAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKnNlYXMuc2MgKyAKICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqbWljcm9jbGltLnNjICsgCiAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKm1hc3Muc2MgKyAKICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2Mqc3BlZWQuc2MgKyAKICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqY29uc3VtZXJmcmFjLnNjICsKICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqbnNwcC5zYyArCiAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKnRoZXJtYWxfYmlhcy5zYzp0c2lnbiArCiAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKm5wcC5zYyArCiAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKmR1cmF0aW9uLnNjICsKICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqaHVtYW5fYm93bGVyLnNjLAogICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbSA9IHJhbmRlZiwgd2VpZ2h0cyA9IHZhcmVmLCBkYXRhID0gdHJlbmRzW2kzLF0sIG1ldGhvZCA9ICdSRU1MJykKICBzYXZlUkRTKG1vZFRmdWxsSG9ybk1hciwgZmlsZSA9ICd0ZW1wL21vZFRmdWxsSG9ybk1hci5yZHMnKQp9CgpzdW1tYXJ5KG1vZFRmdWxsSG9yblRlcnIpCnN1bW1hcnkobW9kVGZ1bGxIb3JuRnJlc2gpCnN1bW1hcnkobW9kVGZ1bGxIb3JuTWFyKQpgYGAKIyMjIFBsb3QgdGhlIHJlYWxtLXNwZWNpZmljIGNvZWZmaWNpZW50cwpBbHNvIHVzZXMgdGhlIGZ1bGwgbW9kZWxzIGFjcm9zcyBhbGwgcmVhbG1zCmBgYHtyIHBsb3QgcmVhbG0gbW9kcywgZmlnLmhlaWdodD0xMiwgZmlnLndpZHRoPTl9Cgpjb2VmczEgPC0gc3VtbWFyeShtb2RUZnVsbEhvcm5yZW0wKSR0VGFibGUKY29lZnMyIDwtIHN1bW1hcnkobW9kVGZ1bGxIb3JuVGVycikkdFRhYmxlCmNvZWZzMyA8LSBzdW1tYXJ5KG1vZFRmdWxsSG9ybkZyZXNoKSR0VGFibGUKY29lZnM0IDwtIHN1bW1hcnkobW9kVGZ1bGxIb3JuTWFyKSR0VGFibGUKCnZhcnN0b3Bsb3QgPC0gdW5pcXVlKGMocm93bmFtZXMoY29lZnMxKSwgcm93bmFtZXMoY29lZnMyKSwgcm93bmFtZXMoY29lZnMzKSwgcm93bmFtZXMoY29lZnM0KSkpCnZhcnN0b3Bsb3QgPC0gdmFyc3RvcGxvdFt3aGljaCghZ3JlcGwoJ0ludGVyY2VwdCcsIHZhcnN0b3Bsb3QpIHwgZ3JlcGwoJzonLCB2YXJzdG9wbG90KSldICMgdmFycyB0byBwbG90Cgpyb3dzMV8xIDwtIHdoaWNoKHJvd25hbWVzKGNvZWZzMSkgJWluJSB2YXJzdG9wbG90KSAjIHJvd3MgaW4gY29lZnMKcm93czFfMiA8LSB3aGljaChyb3duYW1lcyhjb2VmczIpICVpbiUgdmFyc3RvcGxvdCkKcm93czFfMyA8LSB3aGljaChyb3duYW1lcyhjb2VmczMpICVpbiUgdmFyc3RvcGxvdCkKcm93czFfNCA8LSB3aGljaChyb3duYW1lcyhjb2VmczQpICVpbiUgdmFyc3RvcGxvdCkKeGxpbXMgPC0gcmFuZ2UoYyhjb2VmczFbcm93czFfMSwxXSAtIGNvZWZzMVtyb3dzMV8xLDJdLCBjb2VmczFbcm93czFfMSwxXSArIGNvZWZzMVtyb3dzMV8xLDJdLCAKICAgICAgICAgICAgICAgICBjb2VmczJbcm93czFfMiwxXSAtIGNvZWZzMltyb3dzMV8yLDJdLCBjb2VmczJbcm93czFfMiwxXSArIGNvZWZzMltyb3dzMV8yLDJdLCAKICAgICAgICAgICAgICAgICBjb2VmczNbcm93czFfMywxXSAtIGNvZWZzM1tyb3dzMV8zLDJdLCBjb2VmczNbcm93czFfMywxXSArIGNvZWZzM1tyb3dzMV8zLDJdLAogICAgICAgICAgICAgICAgIGNvZWZzNFtyb3dzMV80LDFdIC0gY29lZnM0W3Jvd3MxXzQsMl0sIGNvZWZzNFtyb3dzMV80LDFdICsgY29lZnM0W3Jvd3MxXzQsMl0pKQoKCmNvbHMgPC0gYnJld2VyLnBhbCg0LCAnRGFyazInKSAjIGZvciBmdWxsLCB0ZXJyLCBmcmVzaCwgbWFyCnBjaHMgPC0gYygxLCAxNiwgMTYsIDE2KQpvZmZzIDwtIGMoMC4xLCAwLCAtMC4xLCAtMC4yKSAjIG9mZnNldCB2ZXJ0aWNhbGx5IGZvciBlYWNoIG1vZGVsCgoKcGFyKGxhcyA9IDEsIG1haSA9IGMoMC41LCA0LCAwLjEsIDAuMSkpCgpwbG90KDAsMCwgY29sID0gJ3doaXRlJywgeGxpbSA9IHhsaW1zLCB5bGltID0gYygxLGxlbmd0aCh2YXJzdG9wbG90KSksIHlheHQ9J24nLCB4bGFiID0gJycsIHlsYWIgPScnKQpheGlzKDIsIGF0ID0gbGVuZ3RoKHZhcnN0b3Bsb3QpOjEsIGxhYmVscyA9IHZhcnN0b3Bsb3QsIGNleC5heGlzID0gMC43KQphYmxpbmUodiA9IDAsIGNvbCA9ICdncmV5JywgbHR5ID0gMikKYWJsaW5lKGggPSAxOmxlbmd0aCh2YXJzdG9wbG90KSwgY29sID0gJ2dyZXknLCBsdHkgPSAzKQpmb3IoaSBpbiAxOmxlbmd0aCh2YXJzdG9wbG90KSl7CiAgaWYodmFyc3RvcGxvdFtpXSAlaW4lIHJvd25hbWVzKGNvZWZzMSkpewogICAgeCA9IGNvZWZzMVtyb3duYW1lcyhjb2VmczEpID09IHZhcnN0b3Bsb3RbaV0sIDFdCiAgICBzZSA9IGNvZWZzMVtyb3duYW1lcyhjb2VmczEpID09IHZhcnN0b3Bsb3RbaV0sIDJdCiAgICBwb2ludHMoeCwgbGVuZ3RoKHZhcnN0b3Bsb3QpICsgMSAtIGkgKyBvZmZzWzFdLCBwY2ggPSBwY2hzWzFdLCBjb2wgPSBjb2xzWzFdKQogICAgbGluZXMoeCA9IGMoeC1zZSwgeCtzZSksIHkgPSBjKGxlbmd0aCh2YXJzdG9wbG90KSArIDEgLSBpICsgb2Zmc1sxXSwgbGVuZ3RoKHZhcnN0b3Bsb3QpICsgMSAtIGkgKyBvZmZzWzFdKSwgY29sID0gY29sc1sxXSkKICB9CiAgaWYodmFyc3RvcGxvdFtpXSAlaW4lIHJvd25hbWVzKGNvZWZzMikpewogICAgeCA9IGNvZWZzMltyb3duYW1lcyhjb2VmczIpID09IHZhcnN0b3Bsb3RbaV0sIDFdCiAgICBzZSA9IGNvZWZzMltyb3duYW1lcyhjb2VmczIpID09IHZhcnN0b3Bsb3RbaV0sIDJdCiAgICBwb2ludHMoeCwgbGVuZ3RoKHZhcnN0b3Bsb3QpICsgMSAtIGkgKyBvZmZzWzJdLCBwY2ggPSBwY2hzWzJdLCBjb2wgPSBjb2xzWzJdKQogICAgbGluZXMoeCA9IGMoeC1zZSwgeCtzZSksIHkgPSBjKGxlbmd0aCh2YXJzdG9wbG90KSArIDEgLSBpICsgb2Zmc1syXSwgbGVuZ3RoKHZhcnN0b3Bsb3QpICsgMSAtIGkgKyBvZmZzWzJdKSwgY29sID0gY29sc1syXSkKICB9CiAgaWYodmFyc3RvcGxvdFtpXSAlaW4lIHJvd25hbWVzKGNvZWZzMykpewogICAgeCA9IGNvZWZzM1tyb3duYW1lcyhjb2VmczMpID09IHZhcnN0b3Bsb3RbaV0sIDFdCiAgICBzZSA9IGNvZWZzM1tyb3duYW1lcyhjb2VmczMpID09IHZhcnN0b3Bsb3RbaV0sIDJdCiAgICBwb2ludHMoeCwgbGVuZ3RoKHZhcnN0b3Bsb3QpICsgMSAtIGkgKyBvZmZzWzNdLCBwY2ggPSBwY2hzWzNdLCBjb2wgPSBjb2xzWzNdKQogICAgbGluZXMoeCA9IGMoeC1zZSwgeCtzZSksIHkgPSBjKGxlbmd0aCh2YXJzdG9wbG90KSArIDEgLSBpICsgb2Zmc1szXSwgbGVuZ3RoKHZhcnN0b3Bsb3QpICsgMSAtIGkgKyBvZmZzWzNdKSwgY29sID0gY29sc1szXSkKICB9CiAgaWYodmFyc3RvcGxvdFtpXSAlaW4lIHJvd25hbWVzKGNvZWZzNCkpewogICAgeCA9IGNvZWZzNFtyb3duYW1lcyhjb2VmczQpID09IHZhcnN0b3Bsb3RbaV0sIDFdCiAgICBzZSA9IGNvZWZzNFtyb3duYW1lcyhjb2VmczQpID09IHZhcnN0b3Bsb3RbaV0sIDJdCiAgICBwb2ludHMoeCwgbGVuZ3RoKHZhcnN0b3Bsb3QpICsgMSAtIGkgKyBvZmZzWzRdLCBwY2ggPSBwY2hzWzRdLCBjb2wgPSBjb2xzWzRdKQogICAgbGluZXMoeCA9IGMoeC1zZSwgeCtzZSksIHkgPSBjKGxlbmd0aCh2YXJzdG9wbG90KSArIDEgLSBpICsgb2Zmc1s0XSwgbGVuZ3RoKHZhcnN0b3Bsb3QpICsgMSAtIGkgKyBvZmZzWzRdKSwgY29sID0gY29sc1s0XSkKICB9Cn0KbGVnZW5kKCdib3R0b21sZWZ0JywgY29sID0gY29scywgcGNoID0gcGNocywgbHdkID0gMSwgbGVnZW5kID0gYygnQWxsJywgJ1RlcmVzdHJpYWwnLCAnRnJlc2h3YXRlcicsICdNYXJpbmUnKSkKYGBgCgpbRW5kIHRleHQgaW4gaG9wZXMgdGhpcyBoZWxwcyB0aGUgbGFzdCBmaWd1cmUgc2hvdyB1cCB3aGVuIGtuaXR0ZWRd